譯者按: 從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
這個問題標準答案。須要描述框架的優缺點,這樣能夠反映開發者對框架的熟悉程度。json
XSS(Cross-Site Scripting,跨站腳本攻擊)是指攻擊者在返回的HTML中插入JavaScript腳本。爲了減輕這些攻擊,須要在HTTP頭部配置set-cookie:
結果應該是這樣的: Set-Cookie: sid=; 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以及本文地址:
blog.fundebug.com/2017/04/10/…