Node.js幾道面試題
一些聲明
通過這些問題就來判斷一個人的Node.js水平是不太嚴謹的,但是 它能讓你對面試者在Node.js上的經驗如何有個大概的了解。
但是顯然,這些問題并不會告訴你面試者思考問題的方式。
Show me the code. 結合一些編程題來考察面試者吧
大家都是人,不要做一個死板不近人情的面試官哦。
什么是error-first的回調方式
Error-first回調方式用來同時傳遞error和data。將錯誤作為第一個參數,它就必須先檢查看看有沒有錯誤先。另外的參數就用來傳遞data了。
fs.readFile(filePath, function(err, data) {
if(err) {
//處理錯誤,這里的return很重要,如果發生錯誤,在此處就會停止了。
return console.log(err);
}
//傳遞data
console.log(data);
})
你是如何避免回調地獄的?
-
模塊化把回調函數分割成獨立的函數
-
使用 控制流的庫 ,比如 async
-
generators結合Promise
-
async/await
Promise是什么?
概念不多說了,簡單來說就是幫助你更好地處理異步操作的東西。
new Promise((resolve, reject) => {
setTimeout(() => {
resolve('result');
}, 100)
})
.then(console.log)
.catch(console.error)
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();</code></pre>
如何保證你的HTTP cookies安全不受XSS攻擊
在 set-cookie HTTP頭部加上這幾個信息:
-
HttpOnly-這個屬性用來防止跨站腳本攻擊,它不允許cookie被JavaScript代碼獲取。
-
secure-這個屬性告訴瀏覽器只有在HTTPS連接時才發送cookie
像這樣: Set-Cookit: sid=<cookit-value>; HttpOnly
下面這段代碼有什么問題
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)
如果你正在調試一個大型項目,你不知道哪個Promise可能會有問題,可以使用 unhandledRejection 。它會打印出所有未經處理的Promise異常
process.on('unhandledRejection', (err) => {
console.log(err)
})
下面的代碼有什么問題?
function checkApiKey(apiKeyFromDb, apiKeyReceived) {
if (apiKeyFromDb === apiKeyReceived) {
return true
}
return false
}
說實話我剛看到的時候也是一臉懵逼,這有啥問題?不是很正常的一個if else代碼嗎。
不過這不是普通的if else代碼,這是用來比較安全證書的代碼,這個時候你不能泄露一丁點的信息,所以確保他們在一定的時間內進行比較。否則的你的應用就可能受到時序攻擊了。
什么是時序攻擊( timing attacks )?Node.js使用的V8引擎試圖從表示層面上優化代碼。它一個字符一個字符地比較,一旦找到不符合它就停止比較。
你可以使用 cryptiles 這個npm模塊來解決這個問題
function checkApiKey(apiKeyFromDb, apiKeyReceived) {
return cryptiles.fixedTimeCimparison(apiKeyFromDb, apiKeyReceived)
}
某乎上有個解釋地挺好的 如何通俗地解釋時序攻擊(timing attack)?
下面的代碼會輸出什么
Promise.reso(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)
-
一個新的Promise被創造出來,它會解析參數1
-
解析后的值會被加上1(現在是2),并立即返回了這個2
-
解析的值被丟棄,拋出一個異常
-
異常被丟棄,新的值1被返回
-
catch后運行不會停止,在異常處理之前,它繼續運行,一個新的,增加了1后的值2被返回
-
返回值被打印出來
-
這一行不會運行,因為沒有異常
來自:https://segmentfault.com/a/1190000008037987