在发送节点后无法设置标头

时间:2018-01-26 13:15:32

标签: node.js mongodb express mongoose

我有以下密码重置表单路由,表单有密码和密码确认字段。

viewBox.baseVal

当我填写表格时,我收到以下错误

router.post('/users/reset/:token', (req, res, next) => {
  if(req.body.password === req.body['password-confirm']) {
    req.flash('error', 'Passwords do not match!');
    res.redirect('/users/forgot');
  }

  User.findOne({
    resetPasswordToken: req.params.token,
    resetPasswordExpires: { $gt: Date.now() }
  }, function(err, user) {
    if(!user) {
      req.flash('error', ' Password reset is invalid or has expired');
      res.redirect(302, '/login');
    }

    const setPassword = promisify(user.setPassword, user);
    setPassword(req.body.password);
    user.resetPasswordToken = undefined;
    user.resetPasswordExpires = undefined;
    const updatedUser = user.save();

    user.save((saveError, updatedUser) => {
      // Check if saveError is present here and handle appropriately
      req.login(updatedUser, loginError => {
        req.flash('success_msg', 'Your password has been reset successfully! You are now logged in!');
        res.redirect('/dashboard' + req.user);
      })
    });
  });
});

我还是节点的新手,所以任何重构提示或对此的修复都会非常感激,在这个问题上坚持了几天,不确定我做错了什么。

谢谢。

2 个答案:

答案 0 :(得分:2)

首先,当节点发送API调用的响应超过一次时会发生此错误。其次,最佳做法是在发送响应时使用return,例如return res.json(<OBJECT>);

在您的代码中,您正在检查密码 req.body.password === req.body['password-confirm'] 应该是这样的 req.body.password !== req.body['password-confirm'] 这可能是导致节点发送多个响应的情况

答案 1 :(得分:1)

您多次向客户发送回复,这就是导致Cannot set headers after they are sent to the client错误的原因。

在你的情况下,你应该有return(退出)函数执行。例如。当密码不匹配时,您尝试将用户重定向到/users/forgot,但您没有在此处返回该功能。因此,if条件下面的代码会执行并尝试再次发送响应。

<强>解决方案

router.post('/users/reset/:token', (req, res, next) => {
    if // some condition {
      // some code
      return res.redirect('/users/forgot');
    }

    User.findOne({
       // some code
    }, function(err, user) {
       if(!user) {
            // some code
           return res.redirect(302, '/login');
       }

       // some code 
       user.save((saveError, updatedUser) => {
           req.login(updatedUser, loginError => {
               // some code
               return res.redirect('/dashboard' + req.user);
           })
       });
    });
});