我的快递应用程序使用默认的JSON正文解析器:
app.use(bodyParser.json());
在app.js
文件的下方,我有自己的路由器来构建REST API路由:
var api = require('./routes/api/index');
...
app.use('/api', api);
此路由器有一个错误处理程序,其中包括:
router.use(function (err, req, res, next) {
debugger;
res.status(err.code ? getParseErrorStatus(err.code) : res.status || 500).send({
error: err.message
});
});
每当bodyParser在解析请求体时抛出错误,我都会得到我的通用快递错误处理程序:
// development error handler
// will print stacktrace
if (app.get('env') === 'development') {
app.use(function (err, req, res, next) {
debugger;
res.status(err.status || 500);
res.render('error', {
message: err.message,
error: err
});
});
}
即使调用API路由器捕获的/api/*
URL,也是如此。
如果URL是API URL,那么如何调用我在API路由器中定义的错误处理程序,而不是总是调用泛型错误处理程序,如何使JSON解析错误(被链中的中间件捕获)调用? / p>
答案 0 :(得分:4)
在相同的路由器堆栈级别调用错误处理程序。由于bodyParser.json()
在main / root / app层执行,它将在main / root / app层查找第一个错误处理程序。
因此,如果您想处理API正文解析错误,则必须将bodyParser.json()
中间件移动到需要正文解析的每个路由/路由器。