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 /捕获和处理特定类型的错误等待?