未处理的拒绝错误:发送后无法设置标头

时间:2016-11-14 06:48:46

标签: javascript node.js express callback

我正在使用验证链接验证用户电子邮件。但是我在回调时遇到了错误。为什么呢?

  

错误:未处理的拒绝错误:发送后无法设置标头。

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);
}

1 个答案:

答案 0 :(得分:1)

所以这个错误:

  

错误:未处理拒绝错误:发送后无法设置标头。

基本上意味着您已将有效负载返回给客户端,但您仍在尝试进行更改或再次发送。

我看到(并假设)您正在调用的cb(txt,null)回调用于将消息返回给客户端?

好吧,例如在你的第一个条件中,如果EMAIL_IS_VERIFIED为false,你发送一个回调,然后是&#34; .then()&#34;方法触发器。由于.then()方法会触发,即使您发送了第一个回调函数,您仍然会对您的有效负载执行操作。

现在,我不确定这是触发错误的原因,但如果我的假设是正确的,那么这已经是失败的地方了。我看到你也有类似的方法,所以只需查看你的代码,找到可能在你准备就绪之前发送有效负载的代码。

我对承诺没有百分之百的信心,但我相信如果你只是改变承诺的解决方式,你可以让你的承诺流程类似于你现有的承诺 - 我个人会使用像和的承诺库#39; q&#39;把我的承诺包括在里面,但是自从我使用这些东西以来已经有一段时间了。

或者你可以解释这个代码的结构,但我相信你现在最好使用类似你的代码的承诺。