gpt4 book ai didi

javascript - Bluebird 操作错误未在 catch() 中捕获

转载 作者:行者123 更新时间:2023-12-03 04:50:08 25 4
gpt4 key购买 nike

下面的代码使用 Promise 来执行用户注册(Node/Express)。我使用 Mailgun 来验证电子邮件地址,返回一个 promise ,并且在 promise 内,如果电子邮件地址无效,它将抛出异常。

但是,当电子邮件地址无效并且 validate_email 抛出异常时,app.post 中的 catch block 永远不会捕获该异常,并且 Node 崩溃。我做错了什么?

NodeJS v6.9.2; express v4.15; Bluebird v3.4.7。

(ps我创建Bluebird OperationalErrors只是因为我尝试过自定义错误类型来抛出/捕获,但还没有让它工作,我知道我正在把它搞砸......)

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 不返回 Promise,从而破坏了您所拥有的 Promise 错误处理模式。

你应该promisify它是为了让 then.then.then.catch 链正常工作

关于javascript - Bluebird 操作错误未在 catch() 中捕获,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42692096/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com