Bluebird OperationalError 未在 catch() 中捕获
Bluebird OperationalError not caught in catch()
下面的代码使用 promise 来执行用户注册 (Node/Express)。我使用 Mailgun 来验证电子邮件地址,返回一个承诺,如果电子邮件地址无效,它会在承诺中抛出异常。
然而,当电子邮件地址无效时,validate_email
抛出异常,app.post
中的 catch
块永远不会捕获异常,Node 崩溃。我做错了什么?
NodeJS v6.9.2;快递 v4.15;蓝鸟 v3.4.7.
(ps 我正在创建 Bluebird OperationalErrors 只是因为我已经尝试将自定义错误类型设置为 throw/catch,但没有让它工作,我知道我正在努力。 .)
routes.js
:
const Promise = require('bluebird');
router.post('/register', function(req, res, next) {
console.log('registering... ', req.body);
var ret = {};
verifyRecaptcha(req.body.recaptcha)
.then(()=>{
// exceptions thrown here do NOT get caught in catch()
return mail.validate_email(req.body.email);
}).then(() => {
return db.create_customer(req.body);
}).then((customerId) => {
ret.status = true;
ret.customerId = customerId;
res.send(ret);
}).error((e)=> {
// I expected my validate_email exception
// to be caught here, but it isn't
console.error('/register got an error (108)', e);
res.status(500).send({
error: 'unable to register'
});
}).catch(function(e) {
console.error('/register got an error (114)', e);
res.status(500).send({
error: 'unknown internal error'
});
});
});
mail.js
:
const Promise = require('bluebird');
var mailgun_validate = require('mailgun-validate-email')(<pubkey...>);
exports.validate_email = function(email) {
console.log('validate_email', email);
return Promise.delay(1500).then(()=> {
mailgun_validate(email, (err, result)=> {
console.log('-> cb', err, result);
if (err) throw err; // this gets thrown...
else if (result && result.is_valid === true) return true;
else throw errors.newOperationalError('invalid email address', {email:email});
});
});
};
errors.js
:
const Promise = require('bluebird');
exports.newOperationalError = function(message, data) {
var e = new Promise.OperationalError(message);
for (i in data) {
e[i] = data[i];
}
return e;
}
您遇到此问题是因为 mailgun_validate
没有 return 承诺,从而破坏了您拥有的承诺错误处理模式。
你应该 promisify 它以使 then.then.then.catch
链工作
下面的代码使用 promise 来执行用户注册 (Node/Express)。我使用 Mailgun 来验证电子邮件地址,返回一个承诺,如果电子邮件地址无效,它会在承诺中抛出异常。
然而,当电子邮件地址无效时,validate_email
抛出异常,app.post
中的 catch
块永远不会捕获异常,Node 崩溃。我做错了什么?
NodeJS v6.9.2;快递 v4.15;蓝鸟 v3.4.7.
(ps 我正在创建 Bluebird OperationalErrors 只是因为我已经尝试将自定义错误类型设置为 throw/catch,但没有让它工作,我知道我正在努力。 .)
routes.js
:
const Promise = require('bluebird');
router.post('/register', function(req, res, next) {
console.log('registering... ', req.body);
var ret = {};
verifyRecaptcha(req.body.recaptcha)
.then(()=>{
// exceptions thrown here do NOT get caught in catch()
return mail.validate_email(req.body.email);
}).then(() => {
return db.create_customer(req.body);
}).then((customerId) => {
ret.status = true;
ret.customerId = customerId;
res.send(ret);
}).error((e)=> {
// I expected my validate_email exception
// to be caught here, but it isn't
console.error('/register got an error (108)', e);
res.status(500).send({
error: 'unable to register'
});
}).catch(function(e) {
console.error('/register got an error (114)', e);
res.status(500).send({
error: 'unknown internal error'
});
});
});
mail.js
:
const Promise = require('bluebird');
var mailgun_validate = require('mailgun-validate-email')(<pubkey...>);
exports.validate_email = function(email) {
console.log('validate_email', email);
return Promise.delay(1500).then(()=> {
mailgun_validate(email, (err, result)=> {
console.log('-> cb', err, result);
if (err) throw err; // this gets thrown...
else if (result && result.is_valid === true) return true;
else throw errors.newOperationalError('invalid email address', {email:email});
});
});
};
errors.js
:
const Promise = require('bluebird');
exports.newOperationalError = function(message, data) {
var e = new Promise.OperationalError(message);
for (i in data) {
e[i] = data[i];
}
return e;
}
您遇到此问题是因为 mailgun_validate
没有 return 承诺,从而破坏了您拥有的承诺错误处理模式。
你应该 promisify 它以使 then.then.then.catch
链工作