使用Node.js / promisses按类型捕获异常

时间:2015-10-04 17:04:24

标签: javascript node.js express promise

有以下代码:

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块中处理此错误?我想设置“无法找到任务'”,“无法更新任务'此错误的消息。我应该拆分我的捕获块还是其他什么?提前致谢!

1 个答案:

答案 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子类化为您自己的类型,提供其他信息并抓住这些信息。我发现在我自己的代码中这是一个非常积极的做法,它有助于避免意外地捕获程序员错误(而不是应用程序错误)。