2016-11-14 12 views
0

Я проверяю адрес электронной почты с помощью ссылки для подтверждения. Но у меня возникла ошибка при обратном вызове. Зачем?Unhandled rejection Ошибка: не удается установить заголовки после их отправки

Error : Unhandled rejection Error: Can't set headers after they are sent.

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

так эта ошибка:

Error : Unhandled rejection Error: Can't set headers after they are sent.

в основном означает, что вы уже вернули свою полезную нагрузку на клиента, но вы все еще пытаетесь внести изменения или отправить его еще раз.

Я вижу (и предполагаю), что вызываемые вызовы cb (txt, null), которые вы вызываете, предназначены для возврата сообщений клиенту?

Ну, например, в вашем первом условном случае, если EMAIL_IS_VERIFIED является ложным, вы отправляете обратный вызов, а затем запускаете метод «.then()». Поскольку метод .then() запускается, вы все еще делаете материал своей полезной нагрузке даже после того, как вы отправили первый обратный вызов.

Теперь я не уверен, что это то, что вызывает ошибку, но если мое предположение верно, это уже одно место, которое не получится. Я также вижу, что у вас есть аналогичный подход и дальше, поэтому просто посмотрите код на код, который может отправить полезную нагрузку, прежде чем вы действительно будете готовы.

Я не уверен на 100% в обещаниях, но я считаю, что вы можете сделать свою работу потока обещаний похожим на то, что у вас уже есть, если вы просто измените решение обещаний. Лично я бы использовал библиотеку обещаний, такую ​​как q ', чтобы обернуть мои обещания, но прошло какое-то время, так как я работал с этим материалом.

В качестве альтернативы вы могли бы создать код для его разрешения, но я считаю, что вам лучше использовать обещания, подобные вашему коду.

Смежные вопросы