簡単にnodejsサーバを作成します.(8):渋滞しないでどうやって実現しますか?

1398 ワード

今回は、nodejsがブロックなしで動作する方法を理解します.
まず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()の操作は非同期ですから.
次のセクションでは、この問題をどう解決するかを紹介します.