node.jsのリクエストURLとモジュールをマッピングする
リクエストURLとモジュールをマッピングしてみます。実現するにはルータとリクエストハンドラを作成する必要があります。
例えば、http://www.127.0.0.1:8084/とアクセスされたら、startというモジュールを実行する、ということをマッピングと言います。
このマッピングを一つのファイルで管理できたら、マッピングとモジュールが分離できたりして便利です。
以下は、/と/startと/endをそれぞれマッピングしている例です。

途中使用しているJavaScriptのマッピングについてはJavaScriptの連想配列を参照下さい。
以下、server.jsです。まだ、動作はしません。次にリクエストハンドラを実装します。

var http = require('http');
var url = require('url');
var router = require('./router');
var requestHandler = require('./requestHandler');

var handle = new Object();
handle["/"] = requestHandler.start;
handle["/start"] = requestHandler.start;
handle["/end"] = requestHandler.end;

var server = http.createServer(function(req, res){
    var pathname = url.parse(req.url).pathname;
    var query = url.parse(req.url).query;
    
    router.route(pathname,handle);
    
    res.writeHead(200, {'Content-Type': 'text/html'});
    res.write(pathname + '<br />');
    res.write(query + '<br />');
    res.end();
});
server.listen(8084,'127.0.0.1');

console.log('server start');
node.jsのリクエストハンドラ
server.jsを見ると、新しくrequestHandlerをrequireしています。
requestHandler.jsの中身は以下のようになっています。

function start() {
  console.log("Request handler 'start' was called.");
}

function end() {
  console.log("Request handler 'end' was called.");
}

exports.start = start;
exports.end = end;
関数を定義しているだけです。
また、server.jsでは、この関数を連想配列に代入しています。リクエストによって実行する関数をこのファイルに登録するわけです。

node.jsのルータ
ルーターには連想配列を引数に与えるように変更します。
handle[pathname]()とありますが、連想配列にはメソッドが入っています。
このメソッドに()をつけることで即時実行します。これはJavaScriptの仕様です。詳細は、無名関数の宣言に書いてますので参照下さい。

function route(pathname,handle) {
  if (typeof handle[pathname] === 'function') {
    handle[pathname]();
  } else {
    console.log("No request handler found for " + pathname);
    console.log(typeof handle[pathname]);
  }
}

exports.route = route;
実行
これで、実行します。コンソール、ブラウザには以下のように表示されると思います。

C:¥>node server.js
server start
Request handler 'start' was called.
No request handler found for /favicon.ico
undefined


Back to top

Information