【问题标题】:Catch exception by type using Node.js / promisses使用 Node.js/promises 按类型捕获异常
【发布时间】:2016-01-01 08:49:46
【问题描述】:

有如下代码:

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 错误类型)。因此,我刚刚向任务模型添加了验证,并且有机会使用空标题/描述(SequelizeValidationError 错误类型)更新任务。如何在我的 catch 块中处理此错误?我想为此错误设置“找不到任务”、“无法更新任务”消息。我应该拆分我的捕获块还是其他任何东西?提前致谢!

【问题讨论】:

标签: javascript node.js express promise


【解决方案1】:

如果您不愿意使用像 bluebird 这样可以加速和增强原生 Promise API 的库,您可以自己构建一些功能:

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

【讨论】:

  • 你能给我提供使用蓝鸟的例子吗?为了我的任务
  • @malcoauri 基本上,bluebird 开箱即用,因此您只需删除 catch 周围的 errT 而不必定义它(它也会更快),所以只需 @987654325 @ 还有一个内置的 .error 和一个用于应用程序错误的基本 OperationalError 类型,因此您不会意外地忽略程序员错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-08
  • 1970-01-01
  • 1970-01-01
  • 2015-11-17
  • 2018-01-04
  • 1970-01-01
相关资源
最近更新 更多