Node.js面試問(wèn)題的示例分析-創(chuàng)新互聯(lián)

這篇文章主要介紹了Node.js面試問(wèn)題的示例分析,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

為甘德等地區(qū)用戶提供了全套網(wǎng)頁(yè)設(shè)計(jì)制作服務(wù),及甘德網(wǎng)站建設(shè)行業(yè)解決方案。主營(yíng)業(yè)務(wù)為成都做網(wǎng)站、網(wǎng)站制作、甘德網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠(chéng)的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會(huì)得到認(rèn)可,從而選擇與我們長(zhǎng)期合作。這樣,我們也可以走得更遠(yuǎn)!

什么是error-first的回調(diào)方式

Error-first回調(diào)方式用來(lái)同時(shí)傳遞error和data。將錯(cuò)誤作為第一個(gè)參數(shù),它就必須先檢查看看有沒(méi)有錯(cuò)誤先。另外的參數(shù)就用來(lái)傳遞data了。

fs.readFile(filePath, function(err, data) {
 if(err) {
  //處理錯(cuò)誤,這里的return很重要,如果發(fā)生錯(cuò)誤,在此處就會(huì)停止了。
  return console.log(err);
 }
 //傳遞data
 console.log(data);
})

你是如何避免回調(diào)地獄的?

  1. 模塊化 把回調(diào)函數(shù)分割成獨(dú)立的函數(shù)

  2. 使用控制流的庫(kù),比如async

  3. generators結(jié)合Promise

  4. async/await

Promise是什么?

概念不多說(shuō)了,簡(jiǎn)單來(lái)說(shuō)就是幫助你更好地處理異步操作的東西。

new Promise((resolve, reject) => {
 setTimeout(() => {
  resolve('result');
 }, 100)
})
 .then(console.log)
 .catch(console.error)

stub是什么? 舉個(gè)例子?

stub是用來(lái)模擬組件/模塊行為的東西,它在測(cè)試階段為函數(shù)調(diào)用提供內(nèi)部響應(yīng)。

例子是寫文件,但實(shí)際上并沒(méi)有這么做

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頭部加上這幾個(gè)信息:

  1. HttpOnly-這個(gè)屬性用來(lái)防止跨站腳本攻擊,它不允許cookie被JavaScript代碼獲取。

  2. secure-這個(gè)屬性告訴瀏覽器只有在HTTPS連接時(shí)才發(fā)送cookie

像這樣:Set-Cookit: sid=<cookit-value>; HttpOnly

下面這段代碼有什么問(wèn)題

new Promise((resolve, reject) => {
 throw new Error('error')
}).then(console.log)

then后面沒(méi)有跟上catch,這樣的話如果出錯(cuò)的這段代碼還是默默地運(yùn)行,并不會(huì)告訴你哪里出錯(cuò)了。

修改后:

new Promise((resolve, reject) => {
 throw new Error('error')
}).then(console.log).catch(console.error)

如果你正在調(diào)試一個(gè)大型項(xiàng)目,你不知道哪個(gè)Promise可能會(huì)有問(wèn)題,可以使用unhandledRejection。它會(huì)打印出所有未經(jīng)處理的Promise異常

process.on('unhandledRejection', (err) => {
 console.log(err)
})

下面的代碼有什么問(wèn)題?

function checkApiKey(apiKeyFromDb, apiKeyReceived) {
 if (apiKeyFromDb === apiKeyReceived) {
  return true
 }
 return false
}

說(shuō)實(shí)話我剛看到的時(shí)候也是一臉懵逼,這有啥問(wèn)題?不是很正常的一個(gè)if else代碼嗎。

不過(guò)這不是普通的if else代碼,這是用來(lái)比較安全證書的代碼,這個(gè)時(shí)候你不能泄露一丁點(diǎn)的信息,所以確保他們?cè)谝欢ǖ臅r(shí)間內(nèi)進(jìn)行比較。否則的你的應(yīng)用就可能受到時(shí)序攻擊了。

什么是時(shí)序攻擊(timing attacks)?Node.js使用的V8引擎試圖從表示層面上優(yōu)化代碼。它一個(gè)字符一個(gè)字符地比較,一旦找到不符合它就停止比較。

你可以使用cryptiles這個(gè)npm模塊來(lái)解決這個(gè)問(wèn)題

function checkApiKey(apiKeyFromDb, apiKeyReceived) {
 return cryptiles.fixedTimeCimparison(apiKeyFromDb, apiKeyReceived)
}

如何通俗地解釋時(shí)序攻擊(timing attack)?

時(shí)序攻擊屬于側(cè)信道攻擊/旁路攻擊(Side Channel Attack),側(cè)信道攻擊是指利用信道外的信息,比如加解密的速度/加解密時(shí)芯片引腳的電壓/密文傳輸?shù)牧髁亢屯緩降冗M(jìn)行攻擊的方式,一個(gè)詞形容就是“旁敲側(cè)擊”。

舉一個(gè)最簡(jiǎn)單的計(jì)時(shí)攻擊的例子,某個(gè)函數(shù)負(fù)責(zé)比較用戶輸入的密碼和存放在系統(tǒng)內(nèi)密碼是否相同,如果該函數(shù)是從第一位開(kāi)始比較,發(fā)現(xiàn)不同就立即返回,那么通過(guò)計(jì)算返回的速度就知道了大概是哪一位開(kāi)始不同的,這樣就實(shí)現(xiàn)了電影中經(jīng)常出現(xiàn)的按位破解密碼的場(chǎng)景。密碼破解復(fù)雜度成千上萬(wàn)倍甚至百萬(wàn)千萬(wàn)倍的下降。

最簡(jiǎn)單的防御方法是:“發(fā)現(xiàn)錯(cuò)誤的時(shí)候并不立即返回,而是設(shè)一個(gè)標(biāo)志位,直到完全比較完兩個(gè)字符串再返回”。

時(shí)序攻擊并非是一種理論攻擊方法,OpenSSL、OpenSSH等應(yīng)用都曾經(jīng)有時(shí)序攻擊漏洞,舉個(gè)實(shí)際的例子吧:

Node.js面試問(wèn)題的示例分析

下面的代碼會(huì)輸出什么

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)
  1. 一個(gè)新的Promise被創(chuàng)造出來(lái),它會(huì)解析參數(shù)1

  2. 解析后的值會(huì)被加上1(現(xiàn)在是2),并立即返回了這個(gè)2

  3. 解析的值被丟棄,拋出一個(gè)異常

  4. 異常被丟棄,新的值1被返回

  5. catch后運(yùn)行不會(huì)停止,在異常處理之前,它繼續(xù)運(yùn)行,一個(gè)新的,增加了1后的值2被返回

  6. 返回值被打印出來(lái)

  7. 這一行不會(huì)運(yùn)行,因?yàn)闆](méi)有異常

感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“Node.js面試問(wèn)題的示例分析”這篇文章對(duì)大家有幫助,同時(shí)也希望大家多多支持創(chuàng)新互聯(lián)建站,關(guān)注創(chuàng)新互聯(lián)網(wǎng)站建設(shè)公司行業(yè)資訊頻道,更多相關(guān)知識(shí)等著你來(lái)學(xué)習(xí)!

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)建站www.muchs.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。

當(dāng)前標(biāo)題:Node.js面試問(wèn)題的示例分析-創(chuàng)新互聯(lián)
文章分享:http://www.muchs.cn/article24/coigce.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站建設(shè)網(wǎng)站維護(hù)、微信公眾號(hào)做網(wǎng)站、虛擬主機(jī)、網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站制作