2013/12/04更新

[Node] Express3で404と500エラーをいい感じに扱う

このエントリーをはてなブックマークに追加            

こんにちは、@yoheiMuneです。
久しぶりのブログ。。今日は、node.jsのexpress3ライブラリで、404と500エラーをいい感じに扱う方法をブログに書きたいと思います。

画像



まずはExceptionハンドラーを実装する

これから書く404エラーとか500エラーは、express3上で扱えるエラーのみに対応しているため、最終的なエラーハンドリングを書く必要があります。
例えば以下のコードでのエラーは、これから書く500エラーハンドリングで対処できますが、
app.get('/error_sync', function (req, res) {
    throw "aaa";
});
以下のようなエラーの場合には、express3でのエラーハンドリングにかかりません。
app.get('/error_async', function (req, res) {
    setTimeout(function () {
        throw "aaa";
    }, 100);
});
非同期処理になっていると、express3ではキャッチできないんですね。。
もちろんエラーが推測される位置には、try,catchを書いて適切にエラーハンドリングできますが、想定外のエラーもやっぱり発生してしまいます。

そのために、node.jsのエラーハンドリングを実装する必要があります。
node.jsのExceptionHandlerを使った実装となりますが、 詳細はこちらの記事で紹介させて頂いておりますので、ご参照頂けると幸いです。



express3で404エラーを扱う

ではここから本題です。express3で404エラーを扱う場合には、app.jsで以下のような実装を行います。
// 404対策
app.use(function (req, res, next) {
    if (req.xhr) {
        res.json(404, {});
    } else {
        res.render('notfound');
    }
});
注意すべき点は、app.useの列挙の一番最後に書くということです。
express3では、app.useは上から評価されるため、404エラーのハンドリングはできるだけ最後にする必要があります。 例えば「app.use(router)」などで処理されなかったリクエスト(つまりそのリクエストに対して実装していない=404エラー)の場合に、 最終的に上記のメソッドにたどり着くので、「そんなページないよー」とレスポンスを返すという仕組みです。

これで404エラーのハンドリングができました。



express3で500エラーを扱う

続いて500エラーの扱いです。 express3でキャッチ可能なエラーが発生した場合には、以下のように実装することで、サーバーエラーをハンドリングすることができます。
ポイントは、app.useに指定する関数の引数が4つ(err, req, res, next)という点です。
// エラーハンドラー
app.use(function (err, req, res, next) {
	// ログ出力
    console.error('err:', err);
    next(err);
});
app.use(function (err, req, res, next) {
  // ajaxの場合には処理する
  if (req.xhr) {
    res.send(500, { error: 'Something blew up!' });
  } else {
    next(err);
  }
});
app.use(function (err, req, res, next) {
  // 上記以外、全部対応する
  res.status(500);
  res.render('error', { error: err });
});
これも、400エラーのハンドリングと同様に、app.useの並びの一番最後に書くということです。 前に書いてしまうと、予期せぬ動き(例外ハンドリングじゃない動きをしたいのに。。。)という状況になってしまいます。
あと、404エラーと500エラーハンドリングは、どっちを後ろにすべきかという点が気になるかもしれませんが、結論としてはどっちでも良いです。



最後に

node.jsを入門すると初めてやると思われる、とりあえずのサーバー起動。それよりも、express3はすごく便利ですね。 エラーハンドリングもいい感じにできて素敵です。
express3は色々と使っているので、今後のブログでも色々とノウハウを紹介できればと思います。

最後までご覧頂きましてありがとうございました。





こんな記事もいかがですか?

RSS画像

もしご興味をお持ち頂けましたら、ぜひRSSへの登録をお願い致します。