ホームページ  >  記事  >  ウェブフロントエンド  >  Node.js 面接の質問の概要 (回答付き)

Node.js 面接の質問の概要 (回答付き)

不言
不言転載
2018-10-25 14:19:564304ブラウズ

この記事は、Node.js に関する面接の質問をまとめたものです (回答付き)。困っている方は参考にしていただければ幸いです。

翻訳者注: ECMAScript 標準Node.js 構文、および NPM よりmodule の観点から見ると、Node.js の開発は目まぐるしいものであるため、面接での質問も時代に合わせたものにする必要があります。

  • 原文: Node.js インタビューの質問と回答 (2017 年版)

  • 翻訳者: Fundebug

読みやすさを確保するために、この記事では直訳ではなく意訳を使用しています。

#質問

  • error-first コールバック関数とは何ですか?

  • コールバック地獄を回避するにはどうすればよいですか?

  • Promise とは何ですか?

  • 一貫したコーディング スタイルを保証するためにどのようなツールが使用されますか?なぜそうなるのでしょうか?

  • スタブとは何ですか?例を挙げてください。

  • テスト ピラミッドとは何ですか?例を挙げてください

  • どの HTTP フレームワークが一番好きですか?なぜ?

  • Cookie はどのようにして XSS 攻撃を防ぐのでしょうか?

  • 依存関係のセキュリティを確保するにはどうすればよいですか?

回答

1. エラー優先コールバック関数とは何ですか?

Error-First コールバック関数は、エラーとデータを同時に返すために使用されます。最初のパラメータはエラーを返し、他のパラメータはデータを返すために使用されます。

fs.readFile(filePath, function(err, data)
{
    if (err)
    {
        // 处理错误
        return console.log(err);
    }
    console.log(data);
});
2. コールバック地獄を回避するにはどうすればよいですか?

次の方法でコールバック地獄を回避できます:

  • モジュール化: コールバック関数を独立した関数に変換します

  • 使用プロセスaync などのコントロール ライブラリ

    ##Promise を使用する
  • aync/await を使用する (Async/Await が Promise を置き換える 6 つの理由を参照)
  • 3. Promise とは何ですか?
Promise は、非同期操作をより適切に処理するのに役立ちます。以下の例では、結果文字列は 100 ミリ秒後に出力されます。

catch

はエラー処理に使用されます。複数の Promise を連鎖させることができます。

new Promise((resolve, reject) =>
    {
        setTimeout(() =>
        {
            resolve('result');
        }, 100)
    })
    .then(console.log)
    .catch(console.error);
4. 一貫したコーディング スタイルを確保するためにどのようなツールが使用されていますか?なぜそうなるのでしょうか? チームで共同作業する場合、チームメンバーが毎回新しいスタイルに適応する必要がなく、コードをより迅速に変更できるように、一貫したコーディング スタイルを確保することが非常に重要です。これらのツールが役に立ちます。

ESLint
  • Standard
  • ご興味がございましたら、 JavaScript クリーン コーディングを参照してください。
5 スタブとは何ですか? 例を挙げてください。

スタブは、モジュールの動作をシミュレートするために使用されます。テスト時に、スタブは関数呼び出しのシミュレーション結果を返すことができます。たとえば、ファイルを書き込むとき、実際にそれを書き込む必要はありません。

var fs = require('fs');

var writeFileStub = sinon.stub(fs, 'writeFile', function(path, data, cb)
{
    return cb(null);
});

expect(writeFileStub).to.be.called;
writeFileStub.restore();

6. テスト ピラミッドとは何ですか?たとえば、

テスト ピラミッドは、必要な

単体テスト

統合テストエンドツーエンド テストの割合を反映しています。書き込み:

Node.js 面接の質問の概要 (回答付き)HTTP インターフェイスをテストするときは、次のようになります:

#多くの単体テスト、各モジュールを個別にテストします (依存関係にはスタブが必要です)
  • # 統合テストの数を減らし、さまざまなモジュール間の相互作用をテストします (依存関係をスタブにすることはできません)

  • #エンドツーエンドのテストはほとんどありません。実際のインターフェイスを呼び出してください (依存関係をスタブにすることはできません)

  • 7. どの HTTP フレームワークが一番好きですか?なぜ?

    この質問に対する標準的な回答です。フレームワークに対する開発者の精通度を反映するように、フレームワークの長所と短所を説明する必要があります。
8. Cookie はどのようにして XSS 攻撃を防ぐのでしょうか?

XSS (クロスサイト スクリプティング、クロスサイト スクリプティング攻撃) は、攻撃者が返された HTML に JavaScript スクリプトを挿入することを意味します。これらの攻撃を軽減するには、HTTP ヘッダーで

set-cookie

を構成する必要があります:

HttpOnly - この属性は、クロスサイト スクリプティング

を防止します。 , Javascript スクリプトが Cookie にアクセスできなくなるためです。
  • secure - この属性は、リクエストが HTTPS の場合にのみ Cookie を送信するようにブラウザーに指示します。

  • 結果は次のようになります:

    Set-Cookie: sid=; Express を使用する場合、cookie-session が構成されます。デフォルトでは 。

  • 9. 依存関係のセキュリティを確保するにはどうすればよいですか?

Node.js アプリケーションを作成するときは、数百または数千のモジュールに依存する可能性があります。たとえば、Express を使用する場合、27 個のモジュールに直接依存します。したがって、すべての依存関係を手動で確認することは現実的ではありません。唯一の方法は、依存関係に対して自動セキュリティ チェックを実行することです。次のツールから選択できます。

npm outdated

    Trace by RisingStack
  • NSP
  • GreenKeeper
  • Snyk
  • 追加の質問
  • 1. このコードのどこが間違っていますか?

    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)

调试一个大型的项目时,可以使用监控unhandledRejection事件来捕获所有未处理的Promise错误:

process.on('unhandledRejection', (err) =>
{
    console.log(err)
})
2. 这段代码有什么问题?
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)
}

3. 这段代码的输出是什么?

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,逐行解释如下:

  1. 创建新的Promise,resolve值为1。

  2. x为1,加1之后返回2。

  3. x为2,但是没有用到。抛出一个错误。

  4. 捕获错误,但是没有处理。返回1。

  5. x为1,加1之后返回2。

  6. x为2,打印2。

  7. 不会执行,因为没有错误抛出。

以上がNode.js 面接の質問の概要 (回答付き)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はsegmentfault.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。