有以下代码:
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错误类型)。所以,我刚刚在Task模型中添加了验证,并且有机会用空标题/描述更新任务(SequelizeValidationError错误类型)。如何在catch块中处理此错误?我想设置“无法找到任务'”,“无法更新任务'此错误的消息。我应该拆分我的捕获块还是其他什么?提前致谢!
答案 0 :(得分:1)
如果您不愿意使用加速和增强本地承诺API(如bluebird)的库,您可以自己构建一些功能:
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));
强烈建议您将Error子类化为您自己的类型,提供其他信息并抓住这些信息。我发现在我自己的代码中这是一个非常积极的做法,它有助于避免意外地捕获程序员错误(而不是应用程序错误)。