總結(jié)幾道關(guān)于Node.js的面試問題
什么是error-first的回調(diào)方式
Error-first回調(diào)方式用來(lái)同時(shí)傳遞error和data。將錯(cuò)誤作為第一個(gè)參數(shù),它就必須先檢查看看有沒有錯(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)地獄的?
- 模塊化 把回調(diào)函數(shù)分割成獨(dú)立的函數(shù)
- 使用控制流的庫(kù),比如async
- generators結(jié)合Promise
- 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í)際上并沒有這么做
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è)信息:
- HttpOnly-這個(gè)屬性用來(lái)防止跨站腳本攻擊,它不允許cookie被JavaScript代碼獲取。
- secure-這個(gè)屬性告訴瀏覽器只有在HTTPS連接時(shí)才發(fā)送cookie
像這樣:Set-Cookit: sid=<cookit-value>; HttpOnly
下面這段代碼有什么問題
new Promise((resolve, reject) => { throw new Error('error') }).then(console.log)
then后面沒有跟上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ì)有問題,可以使用unhandledRejection。它會(huì)打印出所有未經(jīng)處理的Promise異常
process.on('unhandledRejection', (err) => { console.log(err) })
下面的代碼有什么問題?
function checkApiKey(apiKeyFromDb, apiKeyReceived) { if (apiKeyFromDb === apiKeyReceived) { return true } return false }
說(shuō)實(shí)話我剛看到的時(shí)候也是一臉懵逼,這有啥問題?不是很正常的一個(gè)if else代碼嗎。
不過這不是普通的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è)問題
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ù)是從第一位開始比較,發(fā)現(xiàn)不同就立即返回,那么通過計(jì)算返回的速度就知道了大概是哪一位開始不同的,這樣就實(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í)際的例子吧:
下面的代碼會(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)
- 一個(gè)新的Promise被創(chuàng)造出來(lái),它會(huì)解析參數(shù)1
- 解析后的值會(huì)被加上1(現(xiàn)在是2),并立即返回了這個(gè)2
- 解析的值被丟棄,拋出一個(gè)異常
- 異常被丟棄,新的值1被返回
- catch后運(yùn)行不會(huì)停止,在異常處理之前,它繼續(xù)運(yùn)行,一個(gè)新的,增加了1后的值2被返回
- 返回值被打印出來(lái)
- 這一行不會(huì)運(yùn)行,因?yàn)闆]有異常
總結(jié)
以上就是關(guān)于Node.js的幾道面試題,希望本文的內(nèi)容對(duì)大家能有所幫助,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
Node.js操作MySQL8.0數(shù)據(jù)庫(kù)無(wú)法連接的問題解決
使用node.js連接數(shù)據(jù)庫(kù)MySQL 8時(shí)候,顯示報(bào)錯(cuò) ER_NOT_SUPPORTED_AUTH_MODE,本文就來(lái)介紹一下解決方法,感興趣的可以了解一下2023-10-10詳解nodejs的express如何自動(dòng)生成項(xiàng)目框架
本篇文章主要介紹了nodejs的express如何自動(dòng)生成項(xiàng)目框架,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07webstorm配置支持nodejs并自動(dòng)補(bǔ)全的方法
今天小編就為大家分享一篇webstorm配置支持nodejs并自動(dòng)補(bǔ)全的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2018-05-05如何使用docker直接運(yùn)行不同版本nodejs命令
這篇文章主要介紹了如何使用docker直接運(yùn)行不同版本nodejs命令,在不支持高版本Node.js的舊版操作系統(tǒng)上,可以通過Docker容器技術(shù)解決兼容性問題,需要的朋友可以參考下2024-10-10基于websocket實(shí)現(xiàn)簡(jiǎn)單聊天室對(duì)話
這篇文章主要為大家詳細(xì)介紹了基于websocket實(shí)現(xiàn)簡(jiǎn)單聊天室對(duì)話,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-07-07Node.js對(duì)MongoDB進(jìn)行增刪改查操作的實(shí)例代碼
這篇文章主要介紹了Node.js對(duì)MongoDB進(jìn)行增刪改查操作 ,需要的朋友可以參考下2019-04-04socket.io學(xué)習(xí)教程之基本應(yīng)用(二)
socket.io提供了基于事件的實(shí)時(shí)雙向通訊,下面這篇文章主要給大家介紹了socket.io基本應(yīng)用的相關(guān)資料,對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧。2017-04-04Node.js結(jié)合FFmpeg構(gòu)建自動(dòng)化腳本實(shí)現(xiàn)轉(zhuǎn)碼視頻
傳統(tǒng)的視頻轉(zhuǎn)碼中,很常用的工具是FFmpeg,本文主要介紹了Node.js結(jié)合FFmpeg構(gòu)建自動(dòng)化腳本實(shí)現(xiàn)轉(zhuǎn)碼視頻,具有一定的參考價(jià)值,感興趣的可以了解一下2024-04-04Nodejs alpine基礎(chǔ)之docker鏡像構(gòu)建
這篇文章主要為大家介紹了Nodejs alpine基礎(chǔ)之docker鏡像構(gòu)建,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07