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エラーページを表示させる