簡単にnodejsサーバを作成します.(8):渋滞しないでどうやって実現しますか?
1398 ワード
今回は、nodejsがブロックなしで動作する方法を理解します.
まずstartの処理手順を修正します.
新しいNode.jsモジュールを導入しました.child_processを使うのは、簡単で実用的な非ブロッキング操作を実現するためです.
では、execは何をしましたか?
Node.jsからshellコマンドを実行します.上記の例では、現在のディレクトリのすべてのファイル(「ls-lah」)を取得してから、StartURLを要求すると、ファイル情報をブラウザに出力します.
私たちはサーバーを起動して、アクセスします.http://localhost:8888/start」ページ出力の内容はemptyであることが分かります.
exec()が機能しました.これによって、私たちは非常に時間がかかるshell操作を実行できます.私たちのアプリケーションを強制的に停止させることなく、操作を待つことができます.
そうですが、ページ出力の内容は私たちが望んだ結果ではないようです.
原因を分析します.
私達のコードは同期して実行します.これはexec()を呼び出した後、Node.jsは直ちにreturn contentを実行します.
この時、contentはまだ「empty」です.exec()に伝達されるコールバック関数はまだ実行されていません.exec()の操作は非同期ですから.
次のセクションでは、この問題をどう解決するかを紹介します.
まずstartの処理手順を修正します.
var exec = require("child_process").exec;
function start() {
console.log("Request handler 'start' was called.");
var content = "empty";
exec("ls -lah", function (error, stdout, stderr) {
content = stdout;
});
return content;
}
function upload() {
console.log("Request handler 'upload' was called.");
return "Hello Upload";
}
exports.start = start;
exports.upload = upload;
このコードは、新しい変数content(初期値は「empty」)を作成し、「ls-lah」コマンドを実行し、結果をcontentに割り当て、最後にcontentを返します.新しいNode.jsモジュールを導入しました.child_processを使うのは、簡単で実用的な非ブロッキング操作を実現するためです.
では、execは何をしましたか?
Node.jsからshellコマンドを実行します.上記の例では、現在のディレクトリのすべてのファイル(「ls-lah」)を取得してから、StartURLを要求すると、ファイル情報をブラウザに出力します.
私たちはサーバーを起動して、アクセスします.http://localhost:8888/start」ページ出力の内容はemptyであることが分かります.
exec()が機能しました.これによって、私たちは非常に時間がかかるshell操作を実行できます.私たちのアプリケーションを強制的に停止させることなく、操作を待つことができます.
そうですが、ページ出力の内容は私たちが望んだ結果ではないようです.
原因を分析します.
私達のコードは同期して実行します.これはexec()を呼び出した後、Node.jsは直ちにreturn contentを実行します.
この時、contentはまだ「empty」です.exec()に伝達されるコールバック関数はまだ実行されていません.exec()の操作は非同期ですから.
次のセクションでは、この問題をどう解決するかを紹介します.