Node.jsを学ぶ(その3・アドレスに応じて出力を分ける)

  • 投稿日:
  • by
  • カテゴリ:

前回紹介したプログラムでは、アクセスされたアドレスに関係なく、出力は常に同じでした。
しかし、現実的なWebサーバーを作るなら、アドレスに応じて出力を変えられることが必要です。
そこで、その方法を解説します。

1.urlプロパティ

リクエストに関する情報は、リスナーに渡される1つ目のパラメータに格納されます。
このパラメータはhttp.IncomingMessageというオブジェクトになっています。

http.IncomingMessageには、いくつかのプロパティがあります。
アクセスされたURL(のホスト名/ポート番号から後の部分)は「url」というプロパティから得ることができます。

例えば、「http://localhost:8080/abc/def?ghi=jkl」のアドレスにアクセスされたとします。
この場合、urlプロパティの値は「/abc/def?ghi=jkl」になります。

2.URLをパースする

URLをパースして、個々の部分の情報を得るには、「url」というモジュールのparseメソッドを使います。
パラメータとして、パースしたいURLを渡します。
メソッドの戻り値は、個々の情報を格納したオブジェクトになります。
オブジェクトには以下のようなプロパティが含まれます。

プロパティ内容
hrefパースするURLそのもの
pathnameパスの部分(クエリ文字列より前の部分)
searchクエリ文字列全体(「?」とその後の部分)
queryparseメソッドのパラメータにより変化
pathpathnameとsearchを連結した値

例えば、parseメソッドで「/abc/def?ghi=jkl」をパースするとします。
また、parseメソッドのパラメータとして、URLだけを渡すとします。
すると、結果のオブジェクトの内容は、以下のようになります。

プロパティ
href/abc/def?ghi=jkl
pathname/abc/def
search?ghi=jkl
queryghi=jkl
path/abc/def?ghi=jkl

なお、queryプロパティの使い方は、後日紹介します。

3.事例

前回のプログラムを書き換えて、アクセスされたアドレスに応じて、以下のようにレスポンスを返すようにします。

アドレスレスポンス
http://localhost:8080/Document root
http://localhost:8080/helloHello, node.js
その他Not found

実際にプログラムを組むと、以下のようになります。

var http = require('http');
var url = require('url');

var server = http.createServer(listener);
server.listen(8080);
console.log('Server start');

function listener(request, response) {
  var urlInfo = url.parse(request.url);
  var pathname = urlInfo.pathname;
  if (pathname == '/') {
    response.statusCode = 200;
    response.setHeader('Content-type', 'text/plain');
    response.write('Document root');
    response.end();
  }
  else if (pathname == '/hello') {
    response.statusCode = 200;
    response.setHeader('Content-type', 'text/plain');
    response.write('Hello, node.js');
    response.end();
  }
  else {
    response.statusCode = 404;
    response.setHeader('Content-type', 'text/plain');
    response.write('Not found');
    response.end();
  }
}

主要な点の解説は以下の通りです。

2行目

urlモジュールを読み込んで、変数urlに割り当てます。

9行目

リクエスト(1つ目のパラメータのrequest)のurlプロパティを、parseメソッドでパースして、結果をurlInfoに代入します。

10行目

urlInfoのpathnameプロパティ(アクセスされたアドレスのパスの部分)を、変数pathnameに代入します。

11~16行目

「/」にアクセスされたときに、「Document root」のレスポンスを返します。

17~22行目

「/hello」にアクセスされたときに、「Hello, node.js」のレスポンスを返します。

23~28行目

その他のアドレスにアクセスされたときに、「Not found」のレスポンスを返します。
なお、Not foundなので、ステータスコードを404にしています(24行目)。