使用Node.js + Express(4)+ Mongoose(使用promise而不是回调),我无法理清如何整理我的错误处理。
我得到的(相当简单)是:
app.get('/xxx/:id', function(request, response) {
Xxx.findById(request.params.id).exec()
.then(function(xxx) {
if (xxx == null) throw Error('Xxx '+request.params.id+' not found');
response.send('Found xxx '+request.params.id);
})
.then(null, function(error) { // promise rejected
switch (error.name) {
case 'Error':
response.status(404).send(error.message); // xxx not found
break;
case 'CastError':
response.status(404).send('Invalid id '+request.params.id);
break;
default:
response.status(500).send(error.message);
break;
}
});
});
在这里,在'promise rejected'部分的开关中,Error
是我自己为找不到的潜在有效id抛出的错误,CastError
是Mongoose为无效id抛出的 Cast to ObjectId failed,并且500错误可以例如通过将throw Error()
错误输入为throw Err()
(导致 *ReferenceError:Err未定义 *)。
但就像这样,我的每一条路线都有这个巨大的笨拙的开关来处理不同的错误。
我如何集中错误处理?交换机是否可以以某种方式隐藏在中间件中?
(我确实希望我可以在'promise rejected'块中使用throw error;
重新抛出,但我无法使其工作)。
2条答案
按热度按时间csga3l581#
我会创建中间件来处理错误。使用
next()
处理404s。使用next(err)
处理其他错误。404处理器
错误处理程序
你可以通过发送一个JSON响应来改善这一点,比如:
或
piztneat2#
我最近需要做错误处理.所以,经历了这么多的资源,终于想出了这个.我们将创建一个
custom Error class
和ErrorHandler middleware
.自定义错误类用于动态发送其他细节,如statusCode沿着errMsg.而且,中间件用于集中处理所有错误一次,基本上控制台完整的错误,并发送错误响应.1.创建自定义
Err
Err类接受以下内容,而内置的Error类只接受
message
。message
:您想向客户展示的内容options
:它可以包括与错误相关的附加信息,如err
(实际错误)name
(自定义/实际错误名称)statusCode
(如400、404等)1.创建中间件
ErrorHandler
现在,错误处理很容易。
[* 注意:不需要发送所有选项,如果需要,您可以只发送statusCode。*]
我们可以像这样修改控制器
我们将在
index.js
文件中所有路由的最后添加此中间件。