しかし、「
responseの
writeで書き出すだけ」とはいっても、まさか
writeでHTMLのコードを延々書き出していくわけ? ありえないでしょ。……と思った人。その通り、表示するWebページの内容をスクリプトの中で文字列として用意する――ありえません、そんなの。
やっぱり、表示するページの内容は、HTMLファイルとして用意しておいて、それを読み込んで表示するようになっていなければWebじゃありません。では、次にそれをやってみましょう。
ファイルの読み込みは「
fs」というオブジェクトとして用意されています。
require関数で「
fs」を読み込み、その中にあるメソッドを呼び出して読み込みをします。以下に整理しましょう。
●fsオブジェクトの読み込みvar fs = require('fs');
既に
httpオブジェクトの読み込みはやりましたからわかりますね。
fsオブジェクトも同様に読み込み、変数に代入しておきます。
●ファイルの読み込みfs.readFile( ファイルのパス , エンコード , コールバック関数 );
ファイルの読み込みを行います。普通に考えると「
readFileで読み込んだデータを返す」というようなものを想像しますが、違います。
readFileには返値はありません。なぜなら、これは
非同期で実行される処理だからです。
ファイルの読み込みは、時間のかかる処理です。ですから、「読み込み終えたらデータを返して次に進む」というようになっていると、場合によってはものすごく待たされてしまいます。サーバーでそんなことをしたら、「前にアクセスした人のファイルを読み込み終えるまで全員待ってる」ということになってしまいます。
そこで、「読み込み開始したら、すぐ次の処理に進む」というような設計になっているのです。読み込みの作業はバックグラウンドで行われます。そして読み込みが完了したら、あらかじめ設定しておいた処理を呼び出し、そこで「読み込み後の処理」を行わせる、という考え方です。この「作業が終わったら後で呼び出される関数」のことを「
コールバック関数」といいます。
readFileでは、第1引数に読み込む
ファイルのパスを指定し、第2引数に
エンコード名、そして第3引数に読み込み完了後の
コールバック関数を用意します。読み込み作業がおわったら、コールバック関数の中で処理を行うようにしておくのです。