【发布时间】:2013-03-09 23:58:37
【问题描述】:
如果我像这样用 express 定义错误处理中间件:
app.use(function(err,req,res,next){
// Do Stuff
});
如何获取错误的 HTTP 状态代码(或者我只是假设是 500)?
谢谢,
阿里
【问题讨论】:
标签: node.js error-handling express
如果我像这样用 express 定义错误处理中间件:
app.use(function(err,req,res,next){
// Do Stuff
});
如何获取错误的 HTTP 状态代码(或者我只是假设是 500)?
谢谢,
阿里
【问题讨论】:
标签: node.js error-handling express
你可以尝试在路由中定义状态码:
app.get('/force-error', function(req, res) {
res.status(400)
next(new Error('Bad Request.'))
})
然后:
server.use(function serverErrorHandler (err, req, res, next) {
const code = res.statusCode
// if status 200 change to 500, otherwise get the defined status code
res.status(code === 200 ? 500 : code)
// check if it's a ajax request
if (req.xhr)
res.json({
error: {
status: res.statusCode,
message: err.message,
stack: err.stack,
}
})
else
next(err)
})
【讨论】:
简而言之,您的代码必须根据您在错误处理中间件中处理的特定错误来决定适当的错误代码。
此时不一定会生成 HTTP 状态代码。按照惯例,当我从中间件函数或路由器处理函数调用next(error) 时,我放置了一个code 属性,以便我的错误处理中间件可以执行res.status(err.code || 500).render('error_page', error); 或类似的操作。但是,您是要使用这种方法来处理常见的 404 错误还是只使用 5XX 服务器错误或其他什么,这取决于您。在将错误传递给next 回调时,express 本身或大多数中间件中很少有东西会提供 http 状态代码。
举个具体的例子,假设有人试图在我的应用程序中注册一个用户帐户,其电子邮件地址我发现已在数据库中注册,我可能会这样做 return next(new AlreadyRegistered());,其中 AlreadyRegistered 构造函数将放置一个 this.code = 409; //Conflict错误实例上的属性,因此错误处理中间件将发送该 409 状态代码。 (对于这种“正常操作条件”的错误,在正常路由链中使用错误处理中间件是否更好,这在设计上是有争议的,但希望这个示例仍然是说明性的)。
仅供参考,我还推荐httperrors npm module,它提供了具有statusCode 属性的命名良好的包装类。我在一些项目中使用它取得了很好的效果。
【讨论】: