我正在使用验证链接验证用户电子邮件。但是我在回调时遇到了错误。为什么呢?
错误:未处理的拒绝错误:发送后无法设置标头。
if (req.body.userId && req.body.verificationCode) {
db.User.findOne({
where: {
ID: req.body.userId
}
}).then(function(result) {
if (!result.EMAIL_IS_VERIFIED) {
return db.EmailVerify.findOne({
where: {
VERIFICATION_CODE: req.body.verificationCode
}
});
} else {
console.log("This email is already verified")
cb({
message: 'This email is already verified'
}, null);
}
}).then(function(result) {
if (result) {
var now = Date.now();
if (Math.round(Math.abs((new Date(now) - new Date(result.CREATED_AT)) / (24 * 60 * 60 * 1000))) < 1)
return db.User.update({
EMAIL_IS_VERIFIED: true,
STATUS: 'active'
}, {
where: {
ID: req.body.userId,
EMAIL: result.EMAIL
}
});
else {
console.log("Verification Link is experied")
cb({
message: 'Your verification link is expired'
}, null);
}
} else {
console.log("Sorry, Your verification link is not working.")
cb({
message: "Sorry, Your verification link is not working."
}, null);
}
}).then(function() {
return db.User.findOne({
where: {
id: req.body.userId
}
});
}).then(function(theUser) {
return security.makeToken(theUser);
}).then(function(token) {
cb(null, {
message: messages.user.signUpSuccess,
token: token
});
}).catch(function(err) {
var em = err.message.indexOf('Validation') >= 0 ? "Your provided email is associated with another account!" : err.message;
cb({
message: em,
code: err.code
}, null);
})
} else {
cb({
message: messages.user.missingInfoAtVerification
}, null);
}
答案 0 :(得分:1)
所以这个错误:
错误:未处理拒绝错误:发送后无法设置标头。
基本上意味着您已将有效负载返回给客户端,但您仍在尝试进行更改或再次发送。
我看到(并假设)您正在调用的cb(txt,null)回调用于将消息返回给客户端?
好吧,例如在你的第一个条件中,如果EMAIL_IS_VERIFIED为false,你发送一个回调,然后是&#34; .then()&#34;方法触发器。由于.then()方法会触发,即使您发送了第一个回调函数,您仍然会对您的有效负载执行操作。
现在,我不确定这是触发错误的原因,但如果我的假设是正确的,那么这已经是失败的地方了。我看到你也有类似的方法,所以只需查看你的代码,找到可能在你准备就绪之前发送有效负载的代码。
我对承诺没有百分之百的信心,但我相信如果你只是改变承诺的解决方式,你可以让你的承诺流程类似于你现有的承诺 - 我个人会使用像和的承诺库#39; q&#39;把我的承诺包括在里面,但是自从我使用这些东西以来已经有一段时间了。
或者你可以解释这个代码的结构,但我相信你现在最好使用类似你的代码的承诺。