reset password token nodejs and express, throw er; // Unhandled 'error' event ^ Error: Callback was already called

reset password token nodejs and express, throw er; // Unhandled 'error' event ^ Error: Callback was already called

我正在尝试使用 nodemailer 重设密码。我正在向用户邮件地址发送一封带有 link 的邮件以重置密码。单击页面上的更新密码 link 后,出现以下错误:-

throw er; // Unhandled 'error' event
      ^

Error: Callback was already called.

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

这是我的 post 请求代码:-

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('/');
  });
});

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

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

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

尝试使用 async-await,而不是使用回调。

好的,我弄错了,从 nodemailer.createTransport 中删除 SMTP 解决了这个问题。但是我仍然没有收到闪现消息。