LoginSignup
9
7

More than 5 years have passed since last update.

Expressにて未定義のパスへのリクエストを受け取った際に返す404をerrorhandlerで扱うようにする

Posted at

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の処理を通って以下のように表示されます。

screenshot.png

9
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
7