前回の続き
- リクエストのルーティング化
ルーターを作成してルーティングできるようにした。匿名クラスはどうしても好きになれない。
Stardust:Node user$ node index.js Server has started. Request for /start received. Request received. About to route a request for /start Request for /favicon.ico received. Request received. About to route a request for /favicon.ico
ちゃんと動いている。
- 本当のリクエストハンドラへのルーティング
とりあえずrequesthander.jsファイルにハンドラーを記述してみる。
javascriptは連想配列に関数を設定できるようだ。なのでこんなコードがかける。
var handle = {}
handle["/"] = requestHandlers.start;
function route(handle) {
if (typeof handle[0] === 'function') {
handle[0](); ---> ここのこと!
} else {
console.log("No request handler);
}
}
これで関数が呼び出せる。コードを修正して起動してみた。
http://localhost:8888/startでアクセス
Stardust:Node user$ node index.js Server has started. Request for /start received. Request received. About to route a request for /start Request handler 'start' was called. Request for /favicon.ico received. Request received. About to route a request for /favicon.ico No request handler found for /favicon.ico
今度はhttp://localhost:8888/のみでアクセスしてみる。
Request for / received. Request received. About to route a request for / Request handler 'start' was called. Request for /favicon.ico received. Request received. About to route a request for /favicon.ico No request handler found for /favicon.ico
ちゃんと動いているようだ。
- リクエストハンドラによる応答
nodeではノンブロッキング処理が基本で、イベント駆動に対応させる必要がある。非同期のCallback関数を設定した場合、responseを終了する場所を考えよう。server.jsのstartメソッド内でroute()メソッド後response.endを呼び出してしまうと、Callback関数が終了する前にレスポンスを返してしまうので、真っ白な画面が表示されるだけになる。注意が必要である。
function start(route, handle) {
function onRequest(request, response) {
var pathname = url.parse(request.url).pathname;
console.log("Request for " + pathname + " received.");
console.log("Request received.");
route(handle,pathname,response);
response.end(); ---> これだ!これがダメだった。
}
http.createServer(onRequest).listen(8888);
console.log("Server has started.");
}
- 有益なものを提供する
この章問題なく、upload処理まで終わった。requestに対してListenerを追加するところなどは、Java,PHPなどのフレームワークと同様なので扱いやすい。あと外部モジュールを使って画像ファイルとPostデータ周りも他のフレームワークと変わりはない。
いまさらながら、Socket通信がなかったような。Nodeは簡単にSocket通信できるがウリだったような次はSocket.IOを試してみよう。