express.js 4:在路由器的errorHandler中捕获bodyParser错误

时间:2015-06-16 16:43:32

标签: node.js express body-parser

如何在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错误。我怎样才能做到这一点?

2 个答案:

答案 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 #2679Inconsistent 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级中间件的错误。