nodejs面试题
1、為什么用Nodejs,它有哪些缺點?
- 事件驅動,通過閉包很容易實現客戶端的生命活期。
- 不用擔心多線程,鎖,并行計算的問題
- V8引擎速度非常快
- 對于游戲來說,寫一遍游戲邏輯代碼,前端后端通用
當然Nodejs也有一些缺點:
- nodejs更新很快,可能會出現版本兼容
- nodejs還不算成熟,還沒有大制作
- nodejs不像其他的服務器,對于不同的鏈接,不支持進程和線程操作
2、什么是錯誤優先的回調函數?
錯誤優先(Error-first)的回調函數(Error-First Callback)用于同時返回錯誤和數據。第一個參數返回錯誤,并且驗證它是否出錯;其他參數返回數據。
fs.readFile(filePath, function(err, data){if (err){// 處理錯誤return console.log(err);}console.log(data);});
3、如何避免回調地獄?
以下方式避免回調地獄
- 模塊化:將回調函數轉換為獨立的函數
- 使用流程控制庫,例如[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、用什么工具保證一致的代碼風格?為什么要這樣?
- 團隊協作時,保證一致的代碼風格是非常重要的,這樣團隊成員才可以更快地修改代碼,而不需要每次去適應新的風格。這些工具可以幫助我們:
- [ESLint] (http://eslint.org/)
- [Standard] (https://standardjs.com/)
- JSLint
- JSHint
- ESLint
- JSCS推薦
6、什么是stub?舉例說明
stub用于模塊的行為。測試時,stub可以為函數調用返回模擬的結果。比如說,我們寫文件時,實際上并不需要真正去寫。
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)
少量端到端測試,去調用真正地接口(依賴不能stub)
8、如何用Node監聽80端口
- 這題有陷阱!在類Unix系統中你不應該去監聽80端口,因為這需要超級用戶權限。因此不推薦讓你的應用直接監聽這個端口。
目前,如果你一定要讓你的應用80端口的話,你可以有通過在Node應用的前方再添加一層反向代理(例如nginx)來實現,如下圖。否則,建議你直接監聽大于1024的端口
方向代理指的是以代理服務器來接收Internet上的連接請求,然后將請求轉發給內部網絡上的服務器, 并且將服務器返回的結果發送給客戶端。
9、什么是事件循環
Node采用的是單線程的處理機制(所有的I/O請求都采用非阻塞的工作方式),至少從Node.js開發者的角度是這樣的。而在底層,Node.js借助libuv來作為抽象封裝層,從而屏蔽不同操作系統的差異,Node可以借助livuv來實現線程。下圖表示Node和libuv的關系
Libuv庫負責Node API的執行。它將不同的任務分配給不同的線程,形成一個事件循環,以異步的方式將任務的執行結果返回給V8引擎。可以簡單用下面這張圖來表示
每一個I/O都需要一個回調函數————一旦執行完便堆到事件循環上用于執行
10、運算錯誤與程序員錯誤的區別
- 運算錯誤并不是bug,這是和系統相關的問題,例如請求超時或者硬件故障。而程序員錯誤就是所謂的bug
11、使用NPM有哪些好處?
- 通過NPM,你可以安裝和管理項目的依賴,并且能夠指明依賴項的具體版本號。對于Node應用開發而言,你可以通過package.json文件來管理項目信息,配置腳本,以及指明依賴的具體版本
12、什么是stub?舉個使用場景
- stub是用于模擬一個組件或模塊的函數或程序。在測試用例中,簡單的說,你可以用stub去模擬一個方法,從而避免調用真實的方法,使用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常用來判斷測試通過還是失敗
轉載于:https://www.cnblogs.com/DCL1314/p/7903085.html
總結
- 上一篇: java lock
- 下一篇: i7八代处理器笔记本电脑(酷睿i7八代处