我试图抛出然后在Bluebird Promise链中捕获自定义错误,但是我无法捕获到自定义错误。例如:
function login(req, res, next) {
function LoginError() {}
return User.where('id', req.body.userId).fetch()
.then(function (location) {
if (req.body.password !== location.get('password')) {
throw new LoginError();
}
// returns a promise
return Subscription.where('userId', location.get('userId')).fetch();
})
.then(function (subscription) {
return res.send(JSON.stringify(subscription));
})
.catch(LoginError, function (err) {
return res.send('Login error');
})
.catch(function (err) {
res.send('Other error: ' + JSON.stringify(err));
});
}
当密码不匹配并抛出LoginError
该错误时,错误将捕获在第二个catch块中,而不是的catch块中LoginError
。我究竟做错了什么?
我正在使用Express.js,Bluebird和Bookshelf / Knex,其中User
有一个Bookshelf模型。
蓝鸟catch
通过它们的继承将错误构造函数与a中的谓词函数区分开来:
对于要视为要过滤的错误类型的参数,需要使构造函数的
.prototype
属性为instanceof Error
。可以像下面这样最小化地创建这样的构造函数:
function MyCustomError() {} MyCustomError.prototype = Object.create(Error.prototype);
您将需要为自己做同样的事情LoginError
。
或者,如果您使用的是ES6,则点击class LoginError extends Error {}
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句