このセクションでは、nodejs がノンブロッキング操作を実装する方法を見ていきます。
まず開始ハンドラーを変更しましょう:
このコードは、新しい変数 content (初期値は「空」) を作成し、「ls -lah」コマンドを実行し、結果を content に代入し、最後に content を返します。
新しい Node.js モジュール child_process を導入しました。これは、シンプルで実用的なノンブロッキング操作 exec() の実装に使用されます。
では、exec() は何をするのでしょうか?
Node.jsからシェルコマンドを実行します。上記の例では、現在のディレクトリ (「ls -lah」) にあるすべてのファイルを取得し、/startURL が要求されたときにファイル情報をブラウザに出力するために使用しています。
サーバーを起動して「http://localhost:8888/start」にアクセスすると、ページの出力コンテンツが空であることがわかります。
exec() を使用すると、アプリケーションを強制的に停止して操作を待機させることなく、非常に時間のかかるシェル操作を実行できます。
それでも、ページによって出力されるコンテンツは私たちが望む結果ではないようです。
その理由を分析してみましょう:
コードは同期的に実行されます。つまり、exec() を呼び出した後、Node.js は返されたコンテンツをすぐに実行します。
この時点では、exec() に渡されたコールバック関数がまだ実行されていないため、コンテンツはまだ「空」です。これは、exec() の操作が非同期であるためです。
この問題を解決する方法を次のセクションで紹介します。