天天看點

10 個 Node.js 常見面試題

如果你希望找一份有關node.js的工作,但又不知道從哪裡入手考察自己對node.js的掌握程度。 本文就提供了這樣的一份node.js面試題清單,通過考察node.js程式設計中的一些主要細節, 來幫助你評估你對于node.js開發的掌握程度。

10 個 Node.js 常見面試題

在進入正文之前,需要提前聲明兩點:

這些問題隻是node.js知識體系的一個局部,并不能完全考察被面試者的實際開發能力。

對現實世界開發中遇到的問題,需要的是随機應變與團隊合作,是以你可以嘗試結對程式設計。

<a target="_blank"></a>

什麼是錯誤優先的回調函數?

你如何避免回調地獄?

你如何用node來監聽80端口?

什麼是事件循環?

什麼工具可以用來保證一緻的風格?

運算錯誤與程式員錯誤的差別?

使用npm有哪些好處?

什麼是stub?舉個使用場景?

什麼是測試金字塔?當我們談到http api時,我們如何實施它?

你最喜歡的http架構,并說明原因?

現在,我們依次來解答這些問題吧。

錯誤優先的回調函數用于傳遞錯誤和資料。第一個參數始終應該是一個錯誤對象, 用于檢查程式是否發生了錯誤。其餘的參數用于傳遞資料。例如:

<code>fs.readfile(filepath, function(err, data) {</code>

<code>if (err) {</code>

<code>//handle the error</code>

<code>}</code>

<code>// use the data object</code>

<code>});</code>

解析:這個題目的主要作用在于檢查被面試者對于node中異步操作的一些基本知識的掌握。

你可以有如下幾個方法:

子產品化:将回調函數分割為獨立的函數

使用promises

使用<code>yield</code>來計算生成器或promise

解析:這個問題有很多種答案,取決你使用的場景,例如es6, es7,或者一些控制流庫。

這題有陷阱!在類unix系統中你不應該嘗試監聽80端口,因為這需要超級使用者權限, 是以不建議讓你的應用監聽這個端口。

目前,如果你想讓你的應用一定要監聽80端口,可以這麼做:讓你的node應用監聽大于1024的端口, 然後在它前面在使用一層方向代理(例如nginx)。

解釋:這個問題用于檢查被面試者是否有實際運作node應用的經驗。

libuv庫負責node api的執行。它将不同的任務配置設定給不同的線程,形成一個事件循環, 以異步的方式将任務的執行結果傳回給v8引擎。可以簡單用下面這張圖來表示。

10 個 Node.js 常見面試題

event loop

(圖檔來源于網絡)

解釋:這用于檢查node.js的底層知識,例如什麼是libuv,它的作用是什麼。

你可以有如下的工具:

<a href="http://jslint.com/" target="_blank">jslint</a>

<a href="http://jshint.com/" target="_blank">jshint</a>

<a href="http://eslint.org/" target="_blank">eslint</a>

在團隊開發中,這些工具對于編寫代碼非常的有幫助,能夠幫助強制執行給定的風格指南, 并且通過靜态分析捕獲常見的錯誤。

解析:用于檢查被面試者是否有大型項目開發經驗。

運算錯誤并不是bug,這是和系統相關的問題,例如請求逾時或者硬體故障。而程式員錯誤就是所謂的bug。

解析:這個題目和node關系并不大,用于考察面試者的基礎知識。

通過npm,你可以安裝和管理項目的依賴,并且能夠指明依賴項的具體版本号。 對于node應用開發而言,你可以通過<code>package.json</code>檔案來管理項目資訊,配置腳本, 以及指明項目依賴的具體版本。

解析:它能考察面試者使用npm指令的基礎知識和node.js開發的實際經驗。

stub是用于模拟一個元件/子產品的一個函數或程式。在測試用例中,stub可以為函數調用提供封裝的答案。 當然,你還可以在斷言中指明stub是如何被調用的。

例如在一個讀取檔案的場景中,當你不想讀取一個真正的檔案時:

<code>var fs = require('fs');</code>

<code></code>

<code>var readfilestub = sinon.stub(fs, 'readfile', function (path, cb) {</code>

<code>return cb(null, 'filecontent');</code>

<code>expect(readfilestub).to.be.called;</code>

<code>readfilestub.restore();</code>

解析:用于測試被面試者是否有測試的經驗。如果被面試者知道什麼是stub, 那麼可以繼續問他是如何做單元測試的。

10 個 Node.js 常見面試題

test pyramid

當我們談到http api時,我們可能會涉及到:

有很多針對模型的底層單元測試

但你需要測試模型間如何互動時,需要減少內建測試

解析:本文主要考察被面試者的在測試方面的經驗。

這題沒有唯一的答案。本題主要考察被面試者對于他所使用的node架構的了解程度, 考察他是否能夠給出選擇該架構的理由,優缺點等。

本文來自雲栖社群合作夥伴“linux中國”,原文釋出日期:2015-10-07   

繼續閱讀