Bluebird将其 catchPromise 猴子补丁描述为"filtered variant"描述如下:

这是.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
});

Sequelize中,它具有Bluebird依赖关系并使用Bluebird promises,建议的方法(据我所知,无论如何)捕获查询错误,例如创建新记录时的验证错误,是利用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 / await捕获和处理特定类型的错误?