スタティックファイルを配信する解説
http.createServerでまずサーバを生成し、サーバで探すファイル名を格納するlookup変数を宣言する。lookup変数に値を割り当てる際には論理和演算子(||)を使っている。この演算子を使うことによって、path.basenameの値が存在しない場合にデフォルトの値を代わりに設定できる。
次に、lookup変数に格納したbasenameにcontentディレクトリを付与して相対パスを作り、f変数に割り当てる。そして、fs.existsでその相対パスにファイルが存在するかどうかを判定する。
ファイルが存在する場合は、fs.readFileでファイルを非同期で読み込む。ファイル読み込み時にエラーが発生した場合は、クライアントに500サーバエラーを返してfs.readFileコールバックから離脱する。この挙動を確認したい場合は、ファイルのパーミッションを変更して読み込みができないようにする。
ターミナル$ chmod -r content/index.htmlこれによりファイル読み込み時にエラーが発生し、500サーバエラーが返される。再度このファイルを読み込めるようにするには以下のコマンドを実行する。
ターミナル$ chmod +r content/index.htmlファイルに無事アクセスできた場合は、mimeTypeマッピングオブジェクトからファイルの拡張子に対応するContent-Typeを探し当て、HTTPヘッダを書き、ファイルから取得したデータをレスポンスに加えて送る。リスエストしたファイルが見つからない場合は、上記の処理は行わずに404エラーを返す。
server.jsvar http = require('http');
var path = require('path');
var fs = require('fs');
var mimeTypes = {
'.js': 'text/javascript',
'.html': 'text/html',
'.css': 'text/css'
};
http.createServer(function(request,response){
if(request.url === '/favicon.ico'){
response.end();
return;
}
var lookup = path.basename(decodeURI(request.url))||'index.html',
f = 'content/' + lookup;
fs.exists(f,function(exists){
// console.log(exists ? lookup + "は存在します。" : lookup + "は存在しません。");
if(exists){
fs.readFile(f,function(err,data){
if(err){
response.writeHead(500);
response.end('Server Error!');
return;
}
var headers = {'Content-Type':mimeTypes[path.extname(f)]};
response.writeHead(200,headers);
response.end(data);
});
return;
}
response.writeHead(404);
response.end('ページが見つかりません!');
});
}).listen(8020);
Nodeクックブック p.11