經過這些問題就來判斷一我的的Node.js水平是不太嚴謹的,可是它能讓你對面試者在Node.js上的經驗如何有個大概的瞭解。面試
可是顯然,這些問題並不會告訴你面試者思考問題的方式。npm
Show me the code. 結合一些編程題來考察面試者吧編程
你們都是人,不要作一個死板不近人情的面試官哦。api
Error-first回調方式用來同時傳遞error和data。將錯誤做爲第一個參數,它就必須先檢查看看有沒有錯誤先。另外的參數就用來傳遞data了。瀏覽器
fs.readFile(filePath, function(err, data) { if(err) { //處理錯誤,這裏的return很重要,若是發生錯誤,在此處就會中止了。 return console.log(err); } //傳遞data console.log(data); })
模塊化 把回調函數分割成獨立的函數安全
使用控制流的庫,好比asynccookie
generators結合Promise異步
async/awaitasync
概念很少說了,簡單來講就是幫助你更好地處理異步操做的東西。模塊化
new Promise((resolve, reject) => { setTimeout(() => { resolve('result'); }, 100) }) .then(console.log) .catch(console.error)
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();
在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被返回
返回值被打印出來
這一行不會運行,由於沒有異常