ExpressにはerrorhandlerというMiddlewareがあります。
サーバー側の処理で例外が発生した際にリクエストのAcceptの内容にあわせたエラーを返してくれてとても便利です。
ですが、未定義のパスへのリクエストを受け取った際の404を返すとき、errorhandlerの処理を通らずにExpressのデフォルトの処理を通ってしまい、Acceptの内容にかかわらず、Cannot <メソッド名> <URLパス>
というテキストが返ってしまう問題に遭いました。
解決方法をメモとして残しておきます。
誤った書き方
最初、以下のようなコードを書いていました。
package.json
{
"name": "test",
"version": "0.1.0",
"main": "server.js",
"dependencies": {
"express": "4.8.4",
"errorhandler": "1.1.1"
}
}
server.js
var express = require('express');
var errorhandler = require('errorhandler');
var app = express();
var port = 3000;
app.get('/', function(req, res) {
res.send('Hello world!');
});
app.use(errorhandler());
app.listen(port);
console.log('listening on port ' + port);
このコードでブラウザからhttp://localhost:3000/aaa
などの未定義のパスにアクセスすると、errorhandlerの処理を通らず「Cannot GET /aaa」とだけ書かれたテキストが表示されます。
正しい書き方
以下のようにしました。
server.js
var express = require('express');
var errorhandler = require('errorhandler');
var app = express();
var port = 3000;
app.get('/', function(req, res) {
res.send('Hello world!');
});
//---- ここから ----
app.use(function(req, res, next) {
var error = new Error('Cannot ' + req.method + ' ' + req.path);
error.status = 404;
next(error);
});
//---- ここまで ----
app.use(errorhandler());
app.listen(port);
console.log('listening on port ' + port);
このコードでブラウザからhttp://localhost:3000/aaa
にアクセスすると、errorhandlerの処理を通って以下のように表示されます。