node.jsで404と500のエラー処理
昨日に引き続き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エラーページを表示させる