拙著「株はタイミングで儲けなさい」が発売されました。
過去20年間の株価データを元にバックテストを行い、どのようなタイミングで株を買うのが良いかを解説しています。
自由国民社刊で、定価1,512円(消費税込み)です。
Node.jsを学ぶ(その3・アドレスに応じて出力を分ける)
前回紹介したプログラムでは、アクセスされたアドレスに関係なく、出力は常に同じでした。
しかし、現実的な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 | クエリ文字列全体(「?」とその後の部分) |
query | parseメソッドのパラメータにより変化 |
path | pathnameとsearchを連結した値 |
例えば、parseメソッドで「/abc/def?ghi=jkl」をパースするとします。
また、parseメソッドのパラメータとして、URLだけを渡すとします。
すると、結果のオブジェクトの内容は、以下のようになります。
プロパティ | 値 |
---|---|
href | /abc/def?ghi=jkl |
pathname | /abc/def |
search | ?ghi=jkl |
query | ghi=jkl |
path | /abc/def?ghi=jkl |
なお、queryプロパティの使い方は、後日紹介します。
3.事例
前回のプログラムを書き換えて、アクセスされたアドレスに応じて、以下のようにレスポンスを返すようにします。
アドレス | レスポンス |
---|---|
http://localhost:8080/ | Document root |
http://localhost:8080/hello | Hello, 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行目)。