国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

總結幾道關于Node.js的面試問題

2019-11-19 18:01:04
字體:
來源:轉載
供稿:網友

什么是error-first的回調方式

Error-first回調方式用來同時傳遞error和data。將錯誤作為第一個參數,它就必須先檢查看看有沒有錯誤先。另外的參數就用來傳遞data了。

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

你是如何避免回調地獄的?

  1. 模塊化 把回調函數分割成獨立的函數
  2. 使用控制流的庫,比如async
  3. generators結合Promise
  4. async/await

Promise是什么?

概念不多說了,簡單來說就是幫助你更好地處理異步操作的東西。

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

stub是什么? 舉個例子?

stub是用來模擬組件/模塊行為的東西,它在測試階段為函數調用提供內部響應。

例子是寫文件,但實際上并沒有這么做

var fs = require('fs');var writeFileStub = sinon.stub(fs, 'writeFile', function(path, data, cb) { return cb(null)})expect(writeFileStub).to.be.calledwriteFileStub.restore();

如何保證你的HTTP cookies安全不受XSS攻擊

在set-cookieHTTP頭部加上這幾個信息:

  1. HttpOnly-這個屬性用來防止跨站腳本攻擊,它不允許cookie被JavaScript代碼獲取。
  2. secure-這個屬性告訴瀏覽器只有在HTTPS連接時才發送cookie

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

下面這段代碼有什么問題

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)

如果你正在調試一個大型項目,你不知道哪個Promise可能會有問題,可以使用unhandledRejection。它會打印出所有未經處理的Promise異常

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

下面的代碼有什么問題?

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

說實話我剛看到的時候也是一臉懵逼,這有啥問題?不是很正常的一個if else代碼嗎。

不過這不是普通的if else代碼,這是用來比較安全證書的代碼,這個時候你不能泄露一丁點的信息,所以確保他們在一定的時間內進行比較。否則的你的應用就可能受到時序攻擊了。

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

你可以使用cryptiles這個npm模塊來解決這個問題

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

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

時序攻擊屬于側信道攻擊/旁路攻擊(Side Channel Attack),側信道攻擊是指利用信道外的信息,比如加解密的速度/加解密時芯片引腳的電壓/密文傳輸的流量和途徑等進行攻擊的方式,一個詞形容就是“旁敲側擊”。

舉一個最簡單的計時攻擊的例子,某個函數負責比較用戶輸入的密碼和存放在系統內密碼是否相同,如果該函數是從第一位開始比較,發現不同就立即返回,那么通過計算返回的速度就知道了大概是哪一位開始不同的,這樣就實現了電影中經常出現的按位破解密碼的場景。密碼破解復雜度成千上萬倍甚至百萬千萬倍的下降。

最簡單的防御方法是:“發現錯誤的時候并不立即返回,而是設一個標志位,直到完全比較完兩個字符串再返回”。

時序攻擊并非是一種理論攻擊方法,OpenSSL、OpenSSH等應用都曾經有時序攻擊漏洞,舉個實際的例子吧:

下面的代碼會輸出什么

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. 一個新的Promise被創造出來,它會解析參數1
  2. 解析后的值會被加上1(現在是2),并立即返回了這個2
  3. 解析的值被丟棄,拋出一個異常
  4. 異常被丟棄,新的值1被返回
  5. catch后運行不會停止,在異常處理之前,它繼續運行,一個新的,增加了1后的值2被返回
  6. 返回值被打印出來
  7. 這一行不會運行,因為沒有異常

總結

以上就是關于Node.js的幾道面試題,希望本文的內容對大家能有所幫助,如果有疑問大家可以留言交流,謝謝大家對武林網的支持。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 莱州市| 穆棱市| 织金县| 额济纳旗| 古交市| 出国| 黔西县| 靖远县| 石台县| 个旧市| 红桥区| 繁峙县| 阿克陶县| 库车县| 成武县| 宁夏| 岳普湖县| 易门县| 广安市| 克拉玛依市| 汉源县| 呼和浩特市| 合作市| 广丰县| 玉树县| 文成县| 海南省| 斗六市| 龙南县| 南康市| 柳州市| 冕宁县| 犍为县| 耒阳市| 武城县| 贺兰县| 栖霞市| 于都县| 松潘县| 民勤县| 松潘县|