nodejs常見面試題與參考答案小結

1、為什么用Nodejs,它有哪些缺點?
- 事件驅(qū)動,通過閉包很容易實現(xiàn)客戶端的生命活期。
- 不用擔心多線程,鎖,并行計算的問題
- V8引擎速度非常快
- 對于游戲來說,寫一遍游戲邏輯代碼,前端后端通用
當然Nodejs也有一些缺點:
- nodejs更新很快,可能會出現(xiàn)版本兼容
- nodejs還不算成熟,還沒有大制作
- nodejs不像其他的服務器,對于不同的鏈接,不支持進程和線程操作
2、什么是錯誤優(yōu)先的回調(diào)函數(shù)?
-
錯誤優(yōu)先(Error-first)的回調(diào)函數(shù)(Error-First Callback)用于同時返回錯誤和數(shù)據(jù)。第一個參數(shù)返回錯誤,并且驗證它是否出錯;其他參數(shù)返回數(shù)據(jù)。
fs.readFile(filePath, function(err, data) { if (err) { // 處理錯誤 return console.log(err); } console.log(data); });
3、如何避免回調(diào)地獄?
以下方式避免回調(diào)地獄
- 模塊化:將回調(diào)函數(shù)轉(zhuǎn)換為獨立的函數(shù)
- 使用流程控制庫,例如[aync]
- 使用Promise
- 使用aync/await
4、什么是Promise?
-
Promise可以幫助我們更好地處理異步操作。下面的實例中,100ms后會打印result字符串。catch用于錯誤處理。多個Promise可以鏈接起來。
new Promise((resolve, reject) => { setTimeout(() => { resolve('result'); }, 100) }) .then(console.log) .catch(console.error);
5、用什么工具保證一致的代碼風格?為什么要這樣?
- 團隊協(xié)作時,保證一致的代碼風格是非常重要的,這樣團隊成員才可以更快地修改代碼,而不需要每次去適應新的風格。這些工具可以幫助我們:
- [ESLint] (http://eslint.org/)
- [Standard] (https://standardjs.com/)
- JSLint
- JSHint
- ESLint
- JSCS推薦
6、什么是stub?舉例說明
-
stub用于模塊的行為。測試時,stub可以為函數(shù)調(diào)用返回模擬的結果。比如說,我們寫文件時,實際上并不需要真正去寫。
var fs = require('fs'); var writeFileStub = sinon.stub(fs, 'writeFile', function(path, data, cb) { return cb(null); }); expect(writeFileStub).to.be.called; writeFileStub.restore();
7、什么是測試金字塔?舉例說明
-
測試金字塔反應了需要寫的單元測試,集成測試以及端到端測試的比例:
- 測試HTTP接口時應該是這樣的:
- 很多單元測試,分別測試各個模塊(依賴需要stub)
- 較少的集成測試,測試各個模塊之間的交互(依賴不能stub)
-
少量端到端測試,去調(diào)用真正地接口(依賴不能stub)
8、如何用Node監(jiān)聽80端口
- 這題有陷阱!在類Unix系統(tǒng)中你不應該去監(jiān)聽80端口,因為這需要超級用戶權限。因此不推薦讓你的應用直接監(jiān)聽這個端口。
-
目前,如果你一定要讓你的應用80端口的話,你可以有通過在Node應用的前方再添加一層反向代理(例如nginx)來實現(xiàn),如下圖。否則,建議你直接監(jiān)聽大于1024的端口
-
方向代理指的是以代理服務器來接收Internet上的連接請求,然后將請求轉(zhuǎn)發(fā)給內(nèi)部網(wǎng)絡上的服務器, 并且將服務器返回的結果發(fā)送給客戶端。
9、什么是事件循環(huán)
-
Node采用的是單線程的處理機制(所有的I/O請求都采用非阻塞的工作方式),至少從Node.js開發(fā)者的角度是這樣的。而在底層,Node.js借助libuv來作為抽象封裝層,從而屏蔽不同操作系統(tǒng)的差異,Node可以借助livuv來實現(xiàn)線程。下圖表示Node和libuv的關系
-
Libuv庫負責Node API的執(zhí)行。它將不同的任務分配給不同的線程,形成一個事件循環(huán),以異步的方式將任務的執(zhí)行結果返回給V8引擎??梢院唵斡孟旅孢@張圖來表示
-
每一個I/O都需要一個回調(diào)函數(shù)————一旦執(zhí)行完便堆到事件循環(huán)上用于執(zhí)行
10、運算錯誤與程序員錯誤的區(qū)別
- 運算錯誤并不是bug,這是和系統(tǒng)相關的問題,例如請求超時或者硬件故障。而程序員錯誤就是所謂的bug
11、使用NPM有哪些好處?
- 通過NPM,你可以安裝和管理項目的依賴,并且能夠指明依賴項的具體版本號。對于Node應用開發(fā)而言,你可以通過
package.json
文件來管理項目信息,配置腳本,以及指明依賴的具體版本
12、什么是stub?舉個使用場景
- stub是用于模擬一個組件或模塊的函數(shù)或程序。在測試用例中,簡單的說,你可以用stub去模擬一個方法,從而避免調(diào)用真實的方法,使用stub你還可以返回虛構的結果。你可以配合斷言使用stub。
-
舉個例子,在一個讀取文件的場景中,當你不想讀取一個真正的文件時:
var fs = require('fs'); var readFileStub = sinon.stub(fs, 'readFile', function (path, cb) { return cb(null, 'filecontent'); }); expect(readFileStub).to.be.called; readFileStub.restore();
在單元測試中:Stub是完全模擬一個外部依賴,而Mock常用來判斷測試通過還是失敗
相關文章
- 這篇文章主要介紹了Vue.js的高級面試題(附答案),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2020-01-13
- 這篇文章主要介紹了36 個JS 面試題為你助力金九銀十,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-09-10
- JS 初學者總是對this關鍵字感到困惑,因為與其他現(xiàn)代編程語言相比,JS 中的這this關鍵字有點棘手。今天小編給大家?guī)?0個比較流行的JavaScript面試題 ,感興趣的朋友一起2019-07-12
- 這篇文章主要介紹了javascript作用域,作用域鏈,閉包的面試題,在一些前端面試中經(jīng)常會問題,今天小編特此整理分享到腳本之家平臺,需要的朋友可以參考下2020-02-21