這篇文章帶給大家的內容是關於Node.js的面試題內容總結(附答案),有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。
譯者按: 從ECMAScript標準,Node.js語法以及NPM模組角度來看,Node.js的發展讓人目不暇接,那麼面試題也得與時俱進。
原文: Node.js Interview Questions and Answers (2017 Edition)
譯者: Fundebug
#為了保證可讀性,本文採用意譯而非直譯。
什麼是錯誤優先的回呼函數?
如何避免回調地獄?
什麼是Promise?
用什麼工具保證一致的程式碼風格?為什麼要這樣?
什麼是Stub?舉例說明
#什麼是測試金字塔?舉例說明
最喜歡哪一個HTTP框架?為什麼?
Cookies如何防範XSS攻擊?
如何保證依賴的安全性?
錯誤優先的回呼函數(Error-First Callback)用於同時傳回錯誤和資料。第一個參數傳回錯誤,並且驗證它是否出錯;其他參數用於傳回資料。
fs.readFile(filePath, function(err, data) { if (err) { // 处理错误 return console.log(err); } console.log(data); });
以下方式可以避免回呼地獄:
模組化: 將回呼函數轉換為獨立的函數
使用流程控制庫,例如aync
使用Promise
使用aync/await(參考Async/Await取代Promise的6個理由)
Promise可以幫助我們更好地處理非同步運算。下面的範例中,100ms後會列印result字串。 catch用於錯誤處理。多個Promise可以連結起來。
new Promise((resolve, reject) => { setTimeout(() => { resolve('result'); }, 100) }) .then(console.log) .catch(console.error);
團隊協作時,確保一致的程式碼風格是非常重要的,這樣團隊成員才能更快地修改程式碼,而不需要每次去適應新的風格。這些工具可以幫助我們:
ESLint
#Standard
var fs = require('fs'); var writeFileStub = sinon.stub(fs, 'writeFile', function(path, data, cb) { return cb(null); }); expect(writeFileStub).to.be.called; writeFileStub.restore();
單元測試、集成測試以及端對端測試的比例:
測試HTTP介面時應該是這樣的:
set-cookie:
cross-site scripting,因為它會禁止Javascript腳本存取cookie。
Set-Cookie: sid=
new Promise((resolve, reject) => { throw new Error('error') }) .then(console.log)
之後沒有catch。這樣的話,錯誤會被忽略。可以這樣解決問題: 调试一个大型的项目时,可以使用监控unhandledRejection事件来捕获所有未处理的Promise错误: 比较密码时,不能泄露任何信息,因此比较必须在固定时间完成。否则,可以使用timing attacks来攻击你的应用。为什么会这样呢?Node.js使用V8引擎,它会从性能角度优化代码。它会逐个比较字符串的字母,一旦发现不匹配时就停止比较。当攻击者的密码更准确时,比较的时间越长。因此,攻击者可以通过比较的时间长短来判断密码的正确性。使用cryptiles可以解决这个问题: 答案是2,逐行解释如下: 创建新的Promise,resolve值为1。 x为1,加1之后返回2。 x为2,但是没有用到。抛出一个错误。 捕获错误,但是没有处理。返回1。 x为1,加1之后返回2。 x为2,打印2。 不会执行,因为没有错误抛出。new Promise((resolve, reject) =>
{
throw new Error('error')
})
.then(console.log).catch(console.error)
process.on('unhandledRejection', (err) =>
{
console.log(err)
})
function checkApiKey(apiKeyFromDb, apiKeyReceived)
{
if (apiKeyFromDb === apiKeyReceived)
{
return true
}
return false
}
function checkApiKey(apiKeyFromDb, apiKeyReceived)
{
return cryptiles.fixedTimeComparison(apiKeyFromDb, apiKeyReceived)
}
3. 这段代码的输出是什么?
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)
以上是Node.js的面試題內容總結(附答案)的詳細內容。更多資訊請關注PHP中文網其他相關文章!