您应该始终通过调用 next 将路由/控制器中的错误委托给错误处理程序(这样您就可以在一个地方处理它们,而不是将它们分散在整个应用程序中)。
这是一个例子:
app.get('/', function(req, res, next) {
db.findUser(req.params.userId, function(err, uid) {
if (err) { return next(err); }
/* ... */
});
});
/* Your custom error handler */
app.use(function(err, req, res, next) {
// always log the error here
// send different response based on content type
res.format({
'text/plain': function(){
res.status(500).send('500 - Internal Server Error');
},
'text/html': function(){
res.status(500).send('<h1>Internal Server Error</h1>');
},
'application/json': function(){
res.send({ error: 'internal_error' });
}
});
});
注意:您不必检查err
错误处理程序中的参数,因为它始终存在。
同样非常重要:总是这样做,return next(err);
因为您不希望执行成功代码。
您的两个代码示例都存在缺陷:在您未使用的第一个return next(err)
和您使用过的第二个中return next(err)
,因此后面的代码不应处理错误(因为如果出现错误,它永远不会到达那里),但它应该是“成功”代码。