この記事は、Node.js に関する面接の質問をまとめたものです (回答付き)。困っている方は参考にしていただければ幸いです。
翻訳者注: ECMAScript 標準、Node.js 構文、および NPM よりmodule の観点から見ると、Node.js の開発は目まぐるしいものであるため、面接での質問も時代に合わせたものにする必要があります。
原文: Node.js インタビューの質問と回答 (2017 年版)
翻訳者: Fundebug
読みやすさを確保するために、この記事では直訳ではなく意訳を使用しています。
#質問fs.readFile(filePath, function(err, data) { if (err) { // 处理错误 return console.log(err); } console.log(data); });
new Promise((resolve, reject) => { setTimeout(() => { resolve('result'); }, 100) }) .then(console.log) .catch(console.error);
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
を構成する必要があります:HttpOnly - この属性は、クロスサイト スクリプティング
を防止します。 , Javascript スクリプトが Cookie にアクセスできなくなるためです。secure - この属性は、リクエストが HTTPS の場合にのみ Cookie を送信するようにブラウザーに指示します。
Set-Cookie: sid=
Node.js アプリケーションを作成するときは、数百または数千のモジュールに依存する可能性があります。たとえば、Express を使用する場合、27 個のモジュールに直接依存します。したがって、すべての依存関係を手動で確認することは現実的ではありません。唯一の方法は、依存関係に対して自動セキュリティ チェックを実行することです。次のツールから選択できます。
1. このコードのどこが間違っていますか?
new Promise((resolve, reject) => { throw new Error('error') }) .then(console.log)
new Promise((resolve, reject) => { throw new Error('error') }) .then(console.log).catch(console.error)
调试一个大型的项目时,可以使用监控unhandledRejection事件来捕获所有未处理的Promise错误:
process.on('unhandledRejection', (err) => { console.log(err) })
function checkApiKey(apiKeyFromDb, apiKeyReceived) { if (apiKeyFromDb === apiKeyReceived) { return true } return false }
比较密码时,不能泄露任何信息,因此比较必须在固定时间完成。否则,可以使用timing attacks来攻击你的应用。为什么会这样呢?Node.js使用V8引擎,它会从性能角度优化代码。它会逐个比较字符串的字母,一旦发现不匹配时就停止比较。当攻击者的密码更准确时,比较的时间越长。因此,攻击者可以通过比较的时间长短来判断密码的正确性。使用cryptiles可以解决这个问题:
function checkApiKey(apiKeyFromDb, apiKeyReceived) { return cryptiles.fixedTimeComparison(apiKeyFromDb, apiKeyReceived) }
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)
答案是2,逐行解释如下:
创建新的Promise,resolve值为1。
x为1,加1之后返回2。
x为2,但是没有用到。抛出一个错误。
捕获错误,但是没有处理。返回1。
x为1,加1之后返回2。
x为2,打印2。
不会执行,因为没有错误抛出。
以上がNode.js 面接の質問の概要 (回答付き)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。