使用Async / Await与Bluebird的`catch`过滤变体

时间:2018-02-20 07:35:02

标签: node.js promise async-await sequelize.js bluebird

Bluebird将其Promise猴子catch补丁描述为具有"过滤变体"描述如下:

  

这是.catch的扩展,更像是Java或C#等语言中的catch-clauses。您可以指定一些符合此catch处理程序的错误构造函数,而不是手动检查instanceof或.name ===" SomeError"。首次遇到的具有符合条件的构造函数的catch处理程序将被调用。

给出的例子是:

somePromise.then(function() {
    return a.b.c.d();
}).catch(TypeError, function(e) {
    //If it is a TypeError, will end up here because
    //it is a type error to reference property of undefined
}).catch(ReferenceError, function(e) {
    //Will end up here if a was never declared at all
}).catch(function(e) {
    //Generic catch-the rest, error wasn't TypeError nor
    //ReferenceError
});

在具有Bluebird依赖关系并使用Bluebird承诺的Sequelize中,建议的方法(据我所知,无论如何)来捕获查询错误,例如创建新记录时的验证错误,是利用Bluebird过滤的catch变体。

以下是捕获Sequelize.ValidationError的示例:

models.User.create(params).then(function(user) {
  // do something with user
}).catch(Sequelize.ValidationError, function (err) {
  var error = err.errors[0],
      message = error ? error.message : "Invalid parameters.";

  return res.send(422, { message : message });
}).catch(function(err) {
  next(err);
});

我喜欢这个。它允许我以不同的方式处理验证错误(使用422和错误进行响应),而不是其他常见错误,否则我可能想要冒泡到我的500响应的一般错误捕获器。

不幸的是,据我所知,如果我想在ES6中使用async / await,我将无法做到这一点......

try {
    var user = await models.User.create(params);

    // do something with user
} catch (err) {
    next(err);
}

节点社区中是否存在任何方式或任何常见模式(我都不是新的)来做类似于基于Promise的标准Sequelize / Bluebird方法,以使用async /捕获和处理特定类型的错误等待?

0 个答案:

没有答案