このセクションでは、非ブロッキング操作を実装するNodeJの方法について学びましょう。
最初にスタートハンドラーを変更しましょう:
コードコピーは次のとおりです。
var exec = require( "child_process")。exec;
function start(){
console.log( "request handler 'start'が呼び出されました。");
var content = "empty";
exec( "ls -lah"、function(error、stdout、stderr){
content = stdout;
});
コンテンツを返す;
}
function upload(){
console.log( "要求ハンドラー 'アップロード'が呼び出されました。");
「hello upload」を返します。
}
exports.start = start;
exports.upload = upload;
このコードは、新しい変数コンテンツ(初期値は「空」です)を作成し、「LS -LAH」コマンドを実行し、結果をコンテンツに割り当て、最後にコンテンツを返します。
新しいnode.jsモジュール、child_processを導入しました。これは、シンプルで実用的な非ブロッキング操作を実装するために使用されます:exec()。
では、exec()は何をしますか?
node.jsからシェルコマンドを実行します上記の例では、現在のディレクトリ内のすべてのファイル( "ls -lah")を取得し、 /starturlリクエストの場合にファイル情報をブラウザに出力します。
サーバーを開始し、「http:// localhost:8888/start」にアクセスすると、ページ上のコンテンツ出力が空であることがわかります。
exec()は機能し、それにより、アプリを停止してその操作を待つことなく、非常に時間のかかるシェル操作を実行できます。
それにもかかわらず、ページのコンテンツ出力は私たちが望む結果ではないようです。
理由を分析しましょう。
私たちのコードは同期的に実行されます。つまり、exec()を呼び出した後、node.jsは返されるコンテンツをすぐに実行します。
現時点では、exec()に渡されたコールバック関数がまだ実行されていないため、コンテンツはまだ「空」です - exec()の操作は非同期であるためです。
次のセクションでは、この問題を解決する方法について説明します。