「node.js URLルーティング」とGoogleで検索すると、だいたいExpressを用いたコードが紹介されるけど、今回はExpressなしでURLルーティングのコードを書いてみた。というかExpress全然やっていないし。やろうとしたら、バージョンアップしていて自分の情報収集したバージョンが1つ前のバージョンで書き方が結構違うように思えたからね。
ExpressなしでのNode.jsでURLルーティング
まずは「server.js」とファイルに名前を付けてルートディレクトリに配置。以下はそのコード。
var http=require('http');
var fs=require('fs');
var path=require('path');
var mimeTypes={
'.html' : 'text/html',
'.css' : 'text/css',
'.js' : 'text/javascript',
'.jpg' : 'image/jpg',
'.png' : 'image/png',
'.mp3' : 'audio/mpeg'
};
http.createServer(function(req,res){
var lookup = decodeURI(req.url);
var targetFile = __dirname + lookup;
fs.exists(targetFile , function(exists){
if(exists){
fs.readFile(targetFile,function(err,data){
if(err){
res.writeHead(500);
res.end('Server Error !');
return;
}
var headers = {'Content-Type' : mimeTypes[path.extname(targetFile)]};
res.writeHead(200,headers);
res.end(data);
console.log(targetFile+'が開かれた'+'mimeType:'+mimeTypes[path.extname(targetFile)]);
console.log(path.extname(targetFile));
});
return;
}
res.writeHead(404);
res.end('ページが見つかりません');
});
}).listen(4000);
console.log('Server is moving');
解説
- 魔法の変数の「__dirname」
__dirnameでリクエストされるファイルのディレクトリを返す。これのおかげでいちいちfsを使う時にファイル名を書く必要がなくなる。
- extname()
パスの最後の要素の拡張子を返す。「alissa.html」なら「.html」が返される。返される値は文字列。
- mymeTypeオブジェクト
ヘッダーにコンテンツタイプのMIMEタイプを送るために必要。extnameは文字列なので、プロパティは文字列として記述。MIMEタイプを送らないとHTMLが読み込まれてもcssなどの外部ファイルが読み込まれない事がある。サンプルファイルでその動作を確認。
※いたるところにあるconsole.logはサーバーがちゃんと動作してるかをコマンドラインで確認するために書いたものです。
上記のserver.jsファイルを製作中の経済サイトのルートディレクトリに配置し、動作を確認したところ、正常に作動。__dirnameは素晴らしいね。とはいえやはりストリームを使った方が若干動作速度は速かった。