2012年11月16日金曜日

[node.js + express]存在しないURLへのリクエストに対して404エラーページを表示させる

express new でアプリケーションの雛形を生成した場合、存在しないURLにリクエストを送信すると、単純に text/plain でエラーメッセージが表示されます。

Cannot GET /do_you_exist

開発段階ではこれで何の問題もないのですが、本番運用時にはこれではいくらなんでもそっけない、ということで、
今回は、存在しないURLへのリクエストに対して、常に404エラー用のページを表示させる方法を紹介します。
(以下サンプルはすべてnode v0.8.3 express 3.0.0beta4 で確認しました)


ミドルウェアでルーティング


express コマンドで生成した app.js では app.configure で設定しているミドルウェアのチェーンの最後で、app.router と express.static をセットしています。(下記の例では、stylus もセットしています。)

app.js
app.configure(function(){

  //省略

  app.use(app.router);
  app.use(require('stylus').middleware(__dirname + '/public'));
  app.use(express.static(__dirname + '/public'));
});

これらのミドルウェアでは、リクエストに対するルーティングを行っていて、リクエストにマッチするルート(もしくはアセット)が存在すれば、設定された処理を実行してレスポンスを返し、以降のミドルウェアは呼び出さない、という仕組みになっています。

よって、これらのミドルウェアよりも後に配置されるミドルウェアは、ルーティングにマッチしないリクエストを受け取った時のみ実行される、ということになります。

つまり、ここに404ページへ誘導するミドルウェアを作成すればOKです。
下の例では、テンプレートを指定していますが、静的なhtmlでももちろん大丈夫です。(レスポンスのステータスに 404 をセットするのを忘れずに! )

app.js
app.configure(function(){

  //省略

  app.use(app.router);
  app.use(require('stylus').middleware(__dirname + '/public'));
  app.use(express.static(__dirname + '/public'));

  app.use(function(req, res, next){
    res.status(404);
    res.render('404', {title: "お探しのページは存在しません。"});
  });

もちろん、404エラーページを表示させずに、ログインページやトップページにリダイレクトさせても問題ないでしょう。


まとめ


404エラーページへのルーティングは、middleware で制御する。
404エラーページへルーティングする middleware は、正規のルーティングを行っている milldeware よりも後に配置する。

0 件のコメント:

コメントを投稿