譯者按: 從ECMAScript標準,Node.js語法以及NPM模塊角度來看,Node.js的發展讓人應接不暇,那麼面試題也得與時俱進。javascript
爲了保證可讀性,本文采用意譯而非直譯。html
錯誤優先的回調函數(Error-First Callback)用於同時返回錯誤和數據。第一個參數返回錯誤,而且驗證它是否出錯;其餘參數用於返回數據。java
fs.readFile(filePath, function(err, data) { if (err) { // 處理錯誤 return console.log(err); } console.log(data); });
如下方式能夠避免回調地獄:node
Promise能夠幫助咱們更好地處理異步操做。下面的示例中,100ms後會打印result字符串。catch用於錯誤處理。多個Promise能夠連接起來。git
new Promise((resolve, reject) => { setTimeout(() => { resolve('result'); }, 100) }) .then(console.log) .catch(console.error);
團隊協做時,保證一致的代碼風格是很是重要的,這樣團隊成員才能夠更快地修改代碼,而不須要每次去適應新的風格。這些工具能夠幫助咱們:github
感興趣的話,能夠參考JavaScript Clean Coding面試
Stub用於模擬模塊的行爲。測試時,Stub能夠爲函數調用返回模擬的結果。好比說,當咱們寫文件時,實際上並不須要真正去寫。express
var fs = require('fs'); var writeFileStub = sinon.stub(fs, 'writeFile', function(path, data, cb) { return cb(null); }); expect(writeFileStub).to.be.called; writeFileStub.restore();
測試金字塔反映了須要寫的單元測試、集成測試以及端到端測試的比例:npm
測試HTTP接口時應該是這樣的:json
這個問題標準答案。須要描述框架的優缺點,這樣能夠反映開發者對框架的熟悉程度。
XSS(Cross-Site Scripting,跨站腳本攻擊)是指攻擊者在返回的HTML中插入JavaScript腳本。爲了減輕這些攻擊,須要在HTTP頭部配置set-cookie:
結果應該是這樣的: Set-Cookie: sid=<cookie-value>; HttpOnly. 使用Express的話,cookie-session默認配置好了。
編寫Node.js應用時,極可能依賴成百上千的模塊。例如,使用了Express的話,會直接依賴27個模塊。所以,手動檢查全部依賴是不現實的。惟一的辦法是對依賴進行自動化的安全檢查,有這些工具可供選擇:
new Promise((resolve, reject) => { throw new Error('error') }) .then(console.log)
then以後沒有catch。這樣的話,錯誤會被忽略。能夠這樣解決問題:
new Promise((resolve, reject) => { throw new Error('error') }) .then(console.log).catch(console.error)
調試一個大型的項目時,能夠使用監控unhandledRejection事件來捕獲全部未處理的Promise錯誤:
process.on('unhandledRejection', (err) => { console.log(err) })
function checkApiKey(apiKeyFromDb, apiKeyReceived) { if (apiKeyFromDb === apiKeyReceived) { return true } return false }
比較密碼時,不能泄露任何信息,所以比較必須在固定時間完成。不然,能夠使用timing attacks來攻擊你的應用。爲何會這樣呢?Node.js使用V8引擎,它會從性能角度優化代碼。它會逐個比較字符串的字母,一旦發現不匹配時就中止比較。當攻擊者的密碼更準確時,比較的時間越長。所以,攻擊者能夠經過比較的時間長短來判斷密碼的正確性。使用cryptiles能夠解決這個問題:
function checkApiKey(apiKeyFromDb, apiKeyReceived) { return cryptiles.fixedTimeComparison(apiKeyFromDb, apiKeyReceived) }
Promise.resolve(1) .then((x) => x + 1) .then((x) => { throw new Error('My Error') }) .catch(() => 1) .then((x) => x + 1) .then((x) => console.log(x)) .catch(console.error)
答案是2,逐行解釋以下:
Fundebug專一於JavaScript、微信小程序、微信小遊戲、支付寶小程序、React Native、Node.js和Java實時BUG監控。 自從2016年雙十一正式上線,Fundebug累計處理了7億+錯誤事件,獲得了Google、360、金山軟件、百姓網等衆多知名用戶的承認。歡迎免費試用!
轉載時請註明做者Fundebug以及本文地址:
https://blog.fundebug.com/2017/04/10/nodejs-interview-2017/