我正在使用node.js和express框架构建RESTful API,我正在寻找一种构建单个错误处理中间件的方法。我目前的方法是:
router.get('/some-resource', (req, res, next) => {
// some logic that resolves to BAD REQUEST
const error = new Error('Bad request example message')
error.code = 400; // should I do this?
next(error);
});
我的错误处理中间件如下:
const env = process.env.NODE_ENV;
const ErrorHandler = (error, req, res, next) => {
const {code, stack} = error;
if (env === 'production')
return res.sendStatus(code || 500);
res.status(code).send(stack);
};
module.exports = ErrorHandler;
我应该只将HTTP错误代码分配给 Error 对象的实例,还是认为它是一种不好的做法?是否应该在路由级别指定响应代码?有更好的方法吗?
答案 0 :(得分:3)
将代码与常规Error对象一起传递是完全可以的,但是code
有点太通用了,可能还会被其他Errors使用,因此httpCode
可能会更好。
但是我个人更喜欢使用自定义类,这样我就不必记住错误代码或意外地键入数字,您可以清楚地确定这确实是代表http错误代码的错误,并且{ {1}}没有引用其他内容。
所以设置看起来像这样:
code
错误处理中间件可能如下所示:
class HttpError extends Error {
constructor(code, message) {
super(message)
this.code = code
}
}
class BadRequestError extends HttpError {
constructor(message) {
super(400, message)
}
}
答案 1 :(得分:-1)
您在正确的轨道上。 Error object的MDN文档将有所帮助。另外,跨平台StackTrace.js在您的情况下确实很有帮助。