BlankTar

about | blog | works | photo

昨日に引き続きnode.js触ってます。
socket.ioとかと親和性が高くて素敵。なんですが、なぜかエラー処理の情報が少ないんですよね。
そんな状態で公開できるかってことで(いや多分普通はnginxとかで処理するんだろうけど)、調べてみました。

サンプル

とりあえず動くコードから。

var express = require('express');
var app = express();

app.get('/', function(req, res){
	res.end('hello, world');
});

app.get('/err', function(req, res){
	res.end(hoge);  // hogeなんて変数はないのでエラー。
});

app.use(function(req, res, next){
	res.status(404);
	res.end('my notfound! : ' + req.path);
});

app.use(function(err, req, res, next){
	res.status(500);
	res.end('my 500 error! : ' + err);
});

app.listen(5000, function(){
	console.log('listening start');
});
こんな感じ。
/と/errだけが定義してあって、/errにアクセスすると500エラー、定義してないところにアクセスすると404エラーが出ます。

テンプレート書くのが面倒くさかったのでres.endを使ってますが、普通にres.renderでもおっけーです。

404エラー

そんなアドレスねぇよってとき。
他のパス(=存在するアドレス)に関する処理を書きおわったあとで
app.use(function(req, res, next){
	res.status(404);
	res.end('my notfound! : ' + req.path);
});
みたいなことを書けばおっけー。
他のパスに関する処理を書く前に書いちゃうと、どのページにアクセスしても404って言われるようになるので注意。

500エラー

サーバー内でエラーがあったとき。
こちらも他のパスの処理が終わった後の
app.use(function(err, req, res, next){
	res.status(500);
	res.end('my 500 error! : ' + err);
});
ってやつです。

これについてはちょっと癖があって、例えば/errの処理が
app.get('/err', function(req, res){
	setTimeout(function(){
		res.end(hoge);  // hogeなんて変数はないのでエラー。
	}, 100);
});
とかになってると処理できません。コールバック関数とかまで面倒見てくれないみたい。

参考:
Express.js Custom Error Pages – 404 and 500 - HACK SPARROW
Future is now: [node.js + express]存在しないURLへのリクエストに対して404エラーページを表示させる
< node.jsのNunjucksっていうjinja風なテンプレートエンジンを使ってみる gentooでPILを更新しようとしたらfterrors.hが見つからないって言われた >