JavaScriptでWebアプリを開発できる「Node.js」活用入門 2ページ

Node.jsでのWebアプリケーション開発はじめの1歩

 Node.jsでのWebアプリケーション開発を理解するため、まずはシンプルなWebサーバープログラムをNode.js上で実行させてみよう。リスト1は、Node.jsのWebページにも掲載されている、もっともシンプルなWebアプリケーションだ。

リスト1 もっともシンプルなWebアプリケーション

var http = require('http');  //①httpモジュールの読み込み

http.createServer(function (req, res) {  //②サーバーの作成
  res.writeHead(200, {'Content-Type': 'text/plain'});  //③HTTPヘッダの出力
  res.end('Hello World\n');  //④本文の出力
}).listen(1337, '127.0.0.1');  //⑤ローカルホスト、1337番ポートでlistenする

console.log('Server running at http://127.0.0.1:1337/');  //⑥コンソールにログを出力

 このスクリプトは「HTTPサーバーインスタンスを作成し、リクエストを受けたら「Hello, World」というテキストを出力する」というものだ。まず①の部分でHTTPサーバーが含まれるhttpモジュールを読み込み、②の部分でcreateServer関数を呼び出してサーバーを作成している。createServer関数は引数としてリクエストを処理する関数(requestListener)を取るが、ここでは匿名関数を作成して与えている。

 リクエストを処理する関数の引数には、http.ServerRequestクラスおよびhttp.ServerResponseクラスのオブジェクトが与えられる。http.ServerRequestクラスはリクエストに関する情報を格納するもので、またhttp.ServerResponseクラスはリクエストに対するレスポンスを格納するものだ。ここではまずヘッダを出力するwriteHead関数を実行して「Content-Type: text/plain」というHTTPヘッダーを返すように設定し(③)、続いて与えたデータを出力してレスポンスを終了するend関数を実行して「Hello World\n」という本文を返すように設定している(④)。

 createServer関数はhttp.Server型のオブジェクトを返すので、最後にこのオブジェクトのlisten関数を実行すると待ち受けが開始される(⑤)。listen関数の引数には待ち受けをするポートとIPアドレスを指定する。ここでは1337番ポート、127.0.0.1で待ち受けをする設定となっている。

 最後にコンソールにログを出力し、プログラムは完了となる(⑥)。プログラム自体は終了するが、作成されたhttp.ServerオブジェクトはCtrl+Cキーでプログラムを終了するまで待ち受けを継続した状態となる。

 リスト1の内容をexample.jsという名前で保存し、このファイルを引数に指定してnodeコマンドを実行すると、次のように表示される(図5)。

>node example.js
Server running at http://127.0.0.1:1337/
図5 nodeコマンドの実行例
図5 nodeコマンドの実行例

 この状態でWebブラウザでローカルホスト(localhost、もしくは127.0.0.1)の1337番ポートを開くと、「Hello World」という文字列が表示される(図6)。

図6 Node.jsで実行しているWebサーバーにアクセスした結果
図6 Node.jsで実行しているWebサーバーにアクセスした結果

 さて、このWebサーバープログラムは、「Hello World」という文字列を返すことしかできない。たとえば、「http://localhost/hoge」というリクエストを送っても、返ってくるのは同じく「Hello World」という文字列だけである(図7)。

図7 異なるURLにアクセスしても同じ結果が返ってくる
図7 異なるURLにアクセスしても同じ結果が返ってくる

 リクエストに応じてレスポンスを変化させるには、requestListener内で引数として与えられるhttp.ServerRequest型オブジェクトの値をチェックし、それに応じたレスポンスを行えば良い。リスト2は、リスト1のコードを修正してURLのパス名を返すように変更したものだ。

リスト2 リクエストされたURLのパス名を表示するWebアプリケーション

var http = require('http');

http.createServer(function (req, res) {
  var response_str = "Hello " + req.url + "\n";
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end(response_str);
}).listen(1337, '127.0.0.1');

console.log('Server running at http://127.0.0.1:1337/');

 リクエストされたURLは、http.ServerRequestクラスのオブジェクトであるreqオブジェクトのurl変数に格納される。ここでは「Hello, World」の代わりに、url変数に格納されている文字列を出力している(図8)。

図8 リクエストされたURLを表示するWebアプリケーションの実行例
図8 リクエストされたURLを表示するWebアプリケーションの実行例

 Node.jsでWebアプリケーションを作成する場合、このようにhttp.ServerRequestの値をチェックし、適切なhttp.ServerResponseを返す、という処理を実装すれば良い。