バスケ好きエンジニアのブログ

バスケの事はそんなに書いてません

Node.js (Express) でuncaughtException が起きた時にエラーページを表示する

Node.js で予期せぬエラー uncaughtException が起きた時にサーバを止めないためには

process.on('uncaughtException', function(err) {
    console.log(err);
});

としてエラーをキャッチしてサーバを止めないようにするというのは一般的に知られた方法であるがエラーページを表示したいとかになった時にどうすればいいかわからなかったので調べてみた。 どうやら domain を使えばできるよう。以下は Express フレームワークを用いて書いたサンプル

var express = require('express')
  , routes = require('./routes')
  , domain = require('domain');

var app = express();

app.configure(function(){
  app.set('port', process.env.PORT || 3000);
  app.set('views', __dirname + '/views');
  app.set('view engine', 'jade');
  app.use(express.favicon());
  app.use(express.logger('dev'));
  app.use(express.bodyParser());
  app.use(express.methodOverride());  
  app.use(function(req, res, next) {
      var reqd = domain.create();
      reqd.on('error', function(err) {
          res.render('error/index', {title:'error'});
      });
      reqd.run(next);
  });
  app.use(app.router);
  app.use(express.static(path.join(__dirname, 'public')));
 });

app.configure('development', function(){
  app.use(express.errorHandler());
});

app.get('/', routes.index);

http.createServer(app).listen(app.get('port'), function(){
  console.log("Express server listening on port " + app.get('port'));
});

domain reqd を生成して request ハンドラで next が受け取れるので reqd.run(next) とすることで next 以降の処理でエラーを受け取るようにしてエラーが起きた場合は res にエラーページを返してやるというもの。便利ですね。