您好,登錄后才能下訂單哦!
這篇文章主要介紹了Node.js面試問題的示例分析,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
什么是error-first的回調(diào)方式
Error-first回調(diào)方式用來同時傳遞error和data。將錯誤作為第一個參數(shù),它就必須先檢查看看有沒有錯誤先。另外的參數(shù)就用來傳遞data了。
fs.readFile(filePath, function(err, data) { if(err) { //處理錯誤,這里的return很重要,如果發(fā)生錯誤,在此處就會停止了。 return console.log(err); } //傳遞data console.log(data); })
你是如何避免回調(diào)地獄的?
模塊化 把回調(diào)函數(shù)分割成獨(dú)立的函數(shù)
使用控制流的庫,比如async
generators結(jié)合Promise
async/await
Promise是什么?
概念不多說了,簡單來說就是幫助你更好地處理異步操作的東西。
new Promise((resolve, reject) => { setTimeout(() => { resolve('result'); }, 100) }) .then(console.log) .catch(console.error)
stub是什么? 舉個例子?
stub是用來模擬組件/模塊行為的東西,它在測試階段為函數(shù)調(diào)用提供內(nèi)部響應(yīng)。
例子是寫文件,但實(shí)際上并沒有這么做
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 cookies安全不受XSS攻擊
在set-cookieHTTP頭部加上這幾個信息:
HttpOnly-這個屬性用來防止跨站腳本攻擊,它不允許cookie被JavaScript代碼獲取。
secure-這個屬性告訴瀏覽器只有在HTTPS連接時才發(fā)送cookie
像這樣:Set-Cookit: sid=<cookit-value>; HttpOnly
下面這段代碼有什么問題
new Promise((resolve, reject) => { throw new Error('error') }).then(console.log)
then后面沒有跟上catch,這樣的話如果出錯的這段代碼還是默默地運(yùn)行,并不會告訴你哪里出錯了。
修改后:
new Promise((resolve, reject) => { throw new Error('error') }).then(console.log).catch(console.error)
如果你正在調(diào)試一個大型項(xiàng)目,你不知道哪個Promise可能會有問題,可以使用unhandledRejection。它會打印出所有未經(jīng)處理的Promise異常
process.on('unhandledRejection', (err) => { console.log(err) })
下面的代碼有什么問題?
function checkApiKey(apiKeyFromDb, apiKeyReceived) { if (apiKeyFromDb === apiKeyReceived) { return true } return false }
說實(shí)話我剛看到的時候也是一臉懵逼,這有啥問題?不是很正常的一個if else代碼嗎。
不過這不是普通的if else代碼,這是用來比較安全證書的代碼,這個時候你不能泄露一丁點(diǎn)的信息,所以確保他們在一定的時間內(nèi)進(jìn)行比較。否則的你的應(yīng)用就可能受到時序攻擊了。
什么是時序攻擊(timing attacks)?Node.js使用的V8引擎試圖從表示層面上優(yōu)化代碼。它一個字符一個字符地比較,一旦找到不符合它就停止比較。
你可以使用cryptiles這個npm模塊來解決這個問題
function checkApiKey(apiKeyFromDb, apiKeyReceived) { return cryptiles.fixedTimeCimparison(apiKeyFromDb, apiKeyReceived) }
如何通俗地解釋時序攻擊(timing attack)?
時序攻擊屬于側(cè)信道攻擊/旁路攻擊(Side Channel Attack),側(cè)信道攻擊是指利用信道外的信息,比如加解密的速度/加解密時芯片引腳的電壓/密文傳輸?shù)牧髁亢屯緩降冗M(jìn)行攻擊的方式,一個詞形容就是“旁敲側(cè)擊”。
舉一個最簡單的計時攻擊的例子,某個函數(shù)負(fù)責(zé)比較用戶輸入的密碼和存放在系統(tǒng)內(nèi)密碼是否相同,如果該函數(shù)是從第一位開始比較,發(fā)現(xiàn)不同就立即返回,那么通過計算返回的速度就知道了大概是哪一位開始不同的,這樣就實(shí)現(xiàn)了電影中經(jīng)常出現(xiàn)的按位破解密碼的場景。密碼破解復(fù)雜度成千上萬倍甚至百萬千萬倍的下降。
最簡單的防御方法是:“發(fā)現(xiàn)錯誤的時候并不立即返回,而是設(shè)一個標(biāo)志位,直到完全比較完兩個字符串再返回”。
時序攻擊并非是一種理論攻擊方法,OpenSSL、OpenSSH等應(yīng)用都曾經(jīng)有時序攻擊漏洞,舉個實(shí)際的例子吧:
下面的代碼會輸出什么
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被創(chuàng)造出來,它會解析參數(shù)1
解析后的值會被加上1(現(xiàn)在是2),并立即返回了這個2
解析的值被丟棄,拋出一個異常
異常被丟棄,新的值1被返回
catch后運(yùn)行不會停止,在異常處理之前,它繼續(xù)運(yùn)行,一個新的,增加了1后的值2被返回
返回值被打印出來
這一行不會運(yùn)行,因?yàn)闆]有異常
感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“Node.js面試問題的示例分析”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,更多相關(guān)知識等著你來學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。