顔の質問nodejs
1、間違った優先コールバック関数は何ですか?
データやエラーを転送するためのエラー・プライオリティコールバック関数。最初の引数はエラーオブジェクトがエラーがプログラムを発生したかどうかをチェックするために、常にあるべきです。データを通信するための残りのパラメータ。
s.readFile(filePathに、関数(ERR、データ){ 場合(ERR){ // エラーを処理 } // データオブジェクトを使用し
});
分析:このトピックの主な役割は、非同期ノード操作を確認するために、インタビューのいくつかの基本的な知識を持つことです。
2、どのようにコールバック地獄を避けるために、
この問題は、ブロッキングを解決するために、JavaScriptがコールバックに大きく依存している、これは、このように長時間実行中のタスクの後にコードの実行を許可する、長時間実行プロセス(IO、タイマーなど)の完了後に実行する機能です。
downloadFile( 'example.com/weather.json'、関数(ERR、データ){ にconsole.log( '気象データを得た:'、データ)。
});
しかし、問題は、コールバック地獄です
理論的には、コールバックのコンセプトは素晴らしいですが、それはコードを読むためにいくつかの本当に混乱し、ハードにつながることができます。想像して、あなたがコールバックをコールバックする必要がある場合
開発者は、この深くネストされたコードは、主に反映され、多くの問題をもたらすために: 1 。コード劣化の可能性 2 。難しいデバッグ 異常困難調査後3.
- モジュールを使用します
ほとんどすべてのプログラミング言語では、複雑さを軽減する最善の方法の一つは、モジュール化されています。JavaScriptは例外ではありません。あなたがコードを書くたび、あなたはおなじみのパターンに遭遇してどの程度の頻度で行うかを見ていくつかの時間がかかります。
何度もあなたはそれ別の場所で同じコード書くのか?コードのあなたのさまざまな部分には共通のテーマを追跡するかどうか?もしそうなら、あなたは物事、抽象化をクリーンアップし、コードを再利用する機会を持っています。
考慮することがいくつかありますが、モジュールの数千人が、あなたが参照を探すことができますが、ここにあります。彼らはそれ以外の場合は破壊し、あなたのコードの可読性が低下します、一般的な、しかし非常に特定のタスクを扱う:複数形、CSV、QS、クローン。
ここでは以前から我々の2つの機能が含まれていformuploader.jsと呼ばれる新しいファイルは、次のとおりです。
module.exports.submit = FORMSUBMIT 関数FORMSUBMIT(submitEvent){ VARの名= document.querySelector( '入力' ).VALUE 要求({ URI: "http://example.com/upload" 、 身体:名前、 方法: " POST」 }、postResponse) } 関数postResponse(ERR、応答、本体){ VAR statusMessage = document.querySelector(」ステータス) であれば(ERR)リターン statusMessage.value = ERR statusMessage.value = ボディ }
今、私たちはformuploader.jsを持っている(と、それはbrowserifiedされた後、スクリプトタグとしてページにロードされている)我々はそれを必要とし、それを使用する必要があること!ここに私たちのアプリケーション固有のコードが今どのように見えるかです:
VaRの formUploader =必要とする( 'formuploader' ) document.querySelector( 'フォーム')。をonSubmit = formUploader.submit
- 約束
約束は習得に時間がかかる場合がありますが、私の意見では、彼らはあなたがJavaScriptで学ぶことができ、より重要な概念の一つです。それだけでなく、大幅にコードの行の数、およびコードの論理フロー追従しやすくを減少させます。
ここでは非常に速く、非常に人気の約束ライブラリのブルーバードを使用した例です。
VaRの約束=(「ブルーバード」が必要です)。 VaRの FSの=は( 'FS'が必要です)。 Promise.promisifyAll(FS)。 varのmyFile = '/ tmpに/テスト' ; fs.readFileAsync(のmyFile、 'UTF8')は、その後(関数(TXT){ TXT = TXT + '\何かをnAppended!' ; fs.writeFile(のmyFile、TXT); })。その後、(関数(){ はconsole.log ( 'テキストを付図!' ); })。キャッチ(関数(ERR){ にconsole.log(ERR); });
このソリューションだけでなく、以前のソリューションよりも短く、かつ(、確かに、約束スタイルのコードは、いくつかの慣れが必要な場合がありますが)読みやすいことに注意してください。コミットメントを学び、理解するための時間をかけて、それはあなたの時間の価値があるだろう。しかし、約束は間違いなく非同期プログラミングのすべての私たちの問題を解決していないので、それらを使用することによって、あなたは速い、クリーン、バグのないアプリケーションを持っていることを前提としていません。キーはあなたに有用であることがときを知ることです。
あなたがチェックすべきいくつかの約束ライブラリは青い鳥Q、であるか、内蔵の約束ES6語を使用する場合。
- 非同期/待ちます
注:これは、関数であるES7は、現在のノードまたはio.js.をサポートしていません。しかし、あなたは今バベルのようなコンバータとして使用することができます。
別のオプションは、私の最近のお気に入り(それはより広くサポートされている)のコードを削除することです、それは非同期関数を使用しています。これは、同期コードを書くことができますように見えますが、それでも非同期コード。
非同期関数のgetUser(ID){ 場合(ID){ 戻りdb.user.byId(ID)を待ちます。 } 他{ 投げる '無効なIDを!' ; } } 試みる{ ユーザーをさせ =(123のgetUserを待ちます)。 } キャッチ(ERR){ console.error(ERR)。 }
db.user.byId(ID)の呼び出しは、我々は通常、(.thenで使用する必要があるだろう約束を)返しますが、とは、私たちが直接解決された値を返すことができます待っています。awaitの呼び出しを含む関数は非同期コードを含み、またのawaitで呼び出されなければならないことを教えてくれる非同期、と前置されていることに注意してください。この方法のもう一つの大きな利点は、我々は今のところ、/キャッチを試みる使用することができ、そしてはるかに直感的バベルなどtranspilers使用してからの約束together.Aside連鎖よりも私たちの非同期機能、としながら、ある Traceurを、あなたもこのような機能を得ることができますノードにおける asyncawaitの パッケージ。
最終的には非同期/のawaitはどこ文法良いですか?百聞は一見にしかずです
3、ノードとポート80でリッスンする方法
この質問はトラップを持っています!それはスーパーユーザ権限が必要なので、Unixライクなシステムでは、ポート80をリッスンしようとしないはずです。モニタポートに直接アプリケーションを作成することは推奨されません。
現在、あなたはあなたのアプリケーションがポート80でリッスンする必要がありますしたい場合、あなたはさらにノードリバースプロキシ(例えば、目の前にある層の適用により増加していることができますnginxの図に示すように)、実装されています。そうでなければ、私はあなたが1024より大きいポートの監視を直接示唆しています。
プロキシエージェントは、インターネットへの接続要求を受信し、内部ネットワーク上のサーバに要求を転送し、サーバからクライアントに返された結果を送信することによって方向が定義されています。
リバースプロキシの詳細については、私はあなたが読むことをお勧めこの記事を。
説明:この質問はインタビューが実際にノード・アプリケーションを実行した経験を持っているかどうかをチェックするために使用されます。
4.イベントループとは何ですか
ノードは、少なくともNode.jsのこのされた現像剤の観点から、シングルスレッド処理機構(全てのI / O要求は、非ブロッキング操作に使用される)を使用します。底部には、のNode.jsによってlibuvオペレーティングシステムの違いをマスクする抽象層としてパッケージ化され、ノードは、マルチスレッドlivuvによって実現されてもよいです。下の図は、ノードとlibuvとの関係を示したものです。
Libuvライブラリは、Node APIの実装を担当しています。これは、バックV8エンジンへの非同期的タスクの実行結果では、イベントループを形成するために、別のスレッドに異なるタスクを割り当てます。これは、単純に次のグラフを使用することができます。
それぞれのI / Oは、コールバック関数を必要とする-一度実装され、実行のためのイベントループを終了するプッシュします。あなたはより詳細な説明が必要な場合は、を参照してください。この動画。また、参照することができ、この記事。
説明:この知識は、どのような役割はい、libuv何であるとして、Node.jsの底面をチェックするために使用されます。
Event Loop: http://www.ruanyifeng.com/blog/2014/10/event-loop.html
5、どのようなツールは、コーディングスタイルの一貫性を確保するために使用することができます
あなたは、次のツールを選択することができます。
チーム開発では、コードを書くためのこれらのツールは、開発チームは、スタイルガイドの規定を施行するために役立つように、だけでなく、静的解析による一般的な間違いをキャプチャするために非常に有用です。
分析:面接は、プロジェクトの開発に大きな経験を持っているかどうかをチェックするために使用されます。
図6に示すように、操作ミスやエラー差プログラマ
-
操作エラーはバグではありません、それは、そのようなタイムアウトやハードウェア障害を要求するなど、システム関連の問題、です。プログラマエラーはバグと呼ばれています。
-
分析:対象とノードは、基本調査インタビュアーのために多くの問題ではありません。
7.持ってNPMを使用することの利点は何ですか?
NPMすることで、インストールして、依存関係管理プロジェクトを、現在のバージョンの依存関係を指定することができます。ノード・アプリケーションの開発のために、あなたはpackage.jsonファイル、設定スクリプトを使用してプロジェクト情報を管理し、依存プロジェクトの特定のバージョンを示すことができます。
NPMの詳細については、あなたはを参照することができます公式ドキュメント。
分析:これは、Node.jsのNPMコマンドの開発に基本的な知識と実践的な経験を使用して面接を調べることができます。
8.スタブとは何ですか?使用シナリオの場合
スタブ関数またはプログラムのコンポーネントまたはモジュールをシミュレートするために使用されます。テストケースでは、単にあなたも結果フィクションを返すことができますスタブを使用して、実際のメソッドを呼び出す避けるために、スタブメソッドをシミュレートするために使用することができると言います。あなたはスタブでアサーションを使用することができます。
たとえば、あなたが本当のファイルを読みたくない場合は、ファイルを読み込むためのシーンで:
VaRの FSの=は( 'FS'が必要です)。 VAR readFileStub = sinon.stub(FS、 'readFileの'、関数(パス、CB){ 戻り CB(NULL、 '含むFileContent' ); }); (readFileStub)は.to.be.called期待します。 readFileStub.restore();
ユニットテスト:モックが渡されたか、失敗したテストを決定するために使用しながら、スタブは、外部シミュレーションに完全に依存しています。
関連するユニットテストの概要のNode.js、あなたはを参照することができ、このリンク。
解決方法:面接テストを経験したかどうかをテストします。面接はどのようなスタブを知っていれば、彼はユニットテストをやっている方法をお尋ねし続けることができます。
8.ピラミッドのテストとは何ですか?
テストピラミッドは意味:我々はテストケースを書くとき、上端のテストよりもはるかにする必要がありますユニットの底面をテストします。
私たちは、HTTP APIについて話すとき、私たちはに関連することができます:
そこ低レベルのユニットテストのための多くのモデルがあります
が、あなたはモデル間の相互作用は、必要が統合テストを削減する方法をテストする必要があるとき
分析:この記事はテストで面接の経験に主にあります。
9、HTTPお好みのフレームと理由
この質問は、単一の答えではありません。彼は理解のレベルを使用して面接調査ノードフレームワークの主な問題は、彼がこのフレームワーク、長所と短所を選択するための理由を与えることができるかどうかを調べます。あなたはを参照することができ、共通のHTTPフレーム、このサイト。
声明
オリジナル住所:https://blog.risingstack.com/node-js-interview-question S