首页 > 解决方案 > 重置密码令牌 nodejs 和 express, throw er; // 未处理的“错误”事件 ^ 错误:回调已被调用

问题描述

我正在尝试使用 nodemailer 重置密码。我正在向用户邮件地址发送一封邮件,其中包含重置密码的链接。单击页面上的更新密码链接后,它会引发以下错误:-

throw er; // Unhandled 'error' event
      ^

Error: Callback was already called.

我不知道错误是什么,回调是什么意思已经被调用?

这是我的帖子请求代码:-

app.post('/reset/:token', function(req, res) {
  async.waterfall([
    function(done) {
      User.findOne({ resetPasswordToken: req.params.token, resetPasswordExpires: { $gt: Date.now() } }, function(err, user) {
        if (!user) {
          req.flash('error', 'Password reset token is invalid or has expired.');
          return res.redirect('back');
        }

        user.password = req.body.password;
        user.resetPasswordToken = undefined;
        user.resetPasswordExpires = undefined;

        user.save(function(err) {
          req.logIn(user, function(err) {
            done(err, user);
          });
          
        });
      });
      // res.redirect('/login');
    },
    function(user, done) {
      var smtpTransport = nodemailer.createTransport('SMTP', {
        // host:'smtp.gmail.com',
        service: 'Gmail',
        auth: {
          user: 'myemail',
          pass: 'password'
        }
      });
      var mailOptions = {
        to: user.email,
        from: 'my email',
        subject: 'Your password has been changed',
        text: 'Hello,\n\n' +
          'This is a confirmation that the password for your account ' + user.email + ' has just been changed.\n'
      };
      smtpTransport.sendMail(mailOptions, function(err) {
        done(err);
      });
    }
  ], function(err) {
    res.redirect('/');
  });
});

我也没有在用户电子邮件上收到任何确认邮件..提前谢谢

标签: node.jscallbacknodemailer

解决方案


您的代码中有几个类似的错误可能会导致错误Error: Callback was already called.

return res.redirect('back');当您在回调中执行(例如)时,该return语句不会影响父函数。因此,可能会res.something发生之前已经发生的事情 res.anotherSomething,但这是不允许的。

尝试使用异步等待,而不是使用回调。


推荐阅读