如何在express.js 4中的路由器errorHandler中捕获bodyParser错误?
示例代码:
mac$ dig www.google.com +nssearch
mac$
向空var express = require('express');
var bodyParser = require('body-parser');
var app = express();
// use bodyParser.json()
app.use(bodyParser.json());
// setup route /test
var testRouter = express.Router();
testRouter.post('/', function(req, res, next) {
next(new Error('not implemented'));
});
testRouter.use('/', function(err, req, res, next) {
res.send('testRouter error: ' + err.message);
});
app.use('/test', testRouter);
// default error handler
app.use(function(err, req, res, next) {
res.send('default error handler: ' + err.message);
});
module.exports = app;
发送POST
请求,并返回/test
。此消息来自testRouter error: not implemented
中定义的错误处理程序,这是我期望发生的。
向testRouter
发送POST
请求的格式错误的json正文将返回/test
。此消息来自默认错误处理程序。
我希望default error handler: [bodyParser error]
中的错误处理程序能够处理对testRouter
的请求发生的所有bodyParser错误。我怎样才能做到这一点?
答案 0 :(得分:2)
您需要testRouter
使用正文解析器中间件:
// not this:
app.use(bodyParser.json());
// but this:
testRouter.use(bodyParser.json());
否则默认路由器将像您注意到的那样处理错误。
如果也希望将身体解析器中间件用于默认路由器,请确保在添加testRouter
之后将其声明为:
app.use('/test', testRouter);
app.use(bodyParser.json());
答案 1 :(得分:1)
robertklep's answer是我的问题的答案,如何在路由器的errorHandler中捕获bodyParser错误。但是,我发现了一个稍微不同的解决方案没有在路由器中捕获错误。我的基本想法是,我希望将与/api/v1.0
下的api相关的所有内容放入javascript模块中的路由器中 - 包括错误处理程序,该错误处理程序以api所需的格式输出错误。因此,我在app.js
中有以下一行:
app.use('/api/v1.0', require('./routes/api/v1.0/api'));
api.js
导出express.Router()
。此路由器永远不会处理来自'外部的错误。的路由器。 (另请参阅GitHub问题catch error of "toplevel" app.use-middlewear in router error handler #2679和Inconsistent behavior with error-handling middleware in routers #2633)。
要使用api特定的错误处理程序捕获所有错误,必须分离api路由器和api错误处理程序。这可以这样做:
api.js
:
var express = require('express');
var router = express.Router();
router.use('/endpoint', require('./endpoint'));
var errorHandler = function (err, req, res, next) {
// all errors need to be returned in json
res.status(err.status || 500);
res.json({ error: err.message });
};
module.exports.router = router;
module.exports.errorHandler = errorHandler;
app.js
:
var api = require('./routes/api/v1.0/api');
app.use('/api/v1.0', api.router);
app.use('/api/v1.0', api.errorHandler);
这样api的错误处理程序仍然只处理/api/v1.0
的请求,但可以捕获所有错误,包括例如bodyParser定义为app级中间件的错误。