[Node] Express3で404と500エラーをいい感じに扱う
こんにちは、@yoheiMuneです。
久しぶりのブログ。。今日は、node.jsのexpress3ライブラリで、404と500エラーをいい感じに扱う方法をブログに書きたいと思います。
例えば以下のコードでのエラーは、これから書く500エラーハンドリングで対処できますが、
もちろんエラーが推測される位置には、try,catchを書いて適切にエラーハンドリングできますが、想定外のエラーもやっぱり発生してしまいます。
そのために、node.jsのエラーハンドリングを実装する必要があります。
node.jsのExceptionHandlerを使った実装となりますが、 詳細はこちらの記事で紹介させて頂いておりますので、ご参照頂けると幸いです。
express3では、app.useは上から評価されるため、404エラーのハンドリングはできるだけ最後にする必要があります。 例えば「app.use(router)」などで処理されなかったリクエスト(つまりそのリクエストに対して実装していない=404エラー)の場合に、 最終的に上記のメソッドにたどり着くので、「そんなページないよー」とレスポンスを返すという仕組みです。
これで404エラーのハンドリングができました。
ポイントは、app.useに指定する関数の引数が4つ(err, req, res, next)という点です。
あと、404エラーと500エラーハンドリングは、どっちを後ろにすべきかという点が気になるかもしれませんが、結論としてはどっちでも良いです。
express3は色々と使っているので、今後のブログでも色々とノウハウを紹介できればと思います。
最後までご覧頂きましてありがとうございました。
久しぶりのブログ。。今日は、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は色々と使っているので、今後のブログでも色々とノウハウを紹介できればと思います。
最後までご覧頂きましてありがとうございました。