使用Node.js / promisses按types捕获exception

有以下代码:

router.put('/:id', function(req, res, next) { models.Task.find(req.params.id).then(function(task) { return task.updateAttributes({ title: req.body.title, description: req.body.description }); }).then(function(task) { res.json(task); }).catch(function(err) { var err = new Error('Cannot find Task'); err.status = 404; next(err); }); }); 

正如你所看到的,我使用这个路由来通过id更新任务模型。 所以,现在我赶上错误,如果没有任何与id的任务,我尝试更新null对象(ReferenceError错误types)的属性。 所以,我刚刚添加validation任务模型,并有机会更新任务与空标题/说明(SequelizeValidationError错误types)。 我怎样才能在我的catch块中处理这个错误? 我想设置“无法find任务”,“无法更新任务”消息这个错误。 我应该分裂我的catch块,还是其他什么? 提前致谢!

如果你不愿意使用一个能够加速和增强蓝鸟等原生承诺API的库,你可以自己构build一些function:

 function errT(type, fn){ return function(err){ // create a handler for errors if(!(err instanceof type)) throw err; // allow fallthrough if it doesn't match return fn(err); }; } 

或者在ES2015语法中类似:

 let errT = (type, fn) => err => (err instanceof type) ? Promise.reject(err) : fn(err); 

这会让你做,例如:

 promiseReturningFn(). catch(errT(TypeError, handleTypeError)). catch(errT(ReferenceError, handleReferenceError)); 

我们热烈地build议您将Error子类化为您自己的types,提供其他信息并抓住这些信息。 我发现在我自己的代码中这是一个非常积极的做法,它有助于避免意外地捕捉程序员错误(而不是应用程序错误)。