使用Node.js + Express (4) + Mongoose(使用Promise而不是回调函数),我无法解决如何整理我的错误处理。
我有以下代码(相当简单):
在“promise rejected”部分的switch语句中,
我有以下代码(相当简单):
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”部分的switch语句中,
Error
是我自己抛出的错误,表示未找到可能有效的id,CastError
是由Mongoose抛出的Cast to ObjectId failed无效id错误,而500错误可以由于将throw Error()
误写为throw Err()
(导致ReferenceError: Err is not defined)等原因触发。
但是这样,我的每个路由都有一个笨重的大开关来处理不同的错误。
如何集中处理错误?能否将开关放入某些中间件中?
(我希望在“promise rejected”块中使用throw error;
重新抛出错误,但我没有成功过。)
.then(null, …)
进行传递吗? - Bergireturn Xxx.findById(...
,然后检查拒绝。我想Spion在某个时候写过一个这样的路由器。 - Benjamin Gruenbaum