types错误:done不是一个函数(nodemailer)

我正在使用nodemailer忘记密码的应用程序,电子邮件执行忘记密码,但是当用户重置密码他们没有得到一个确认电子邮件。 不知道为什么没有发生。

似乎是在完成(错误)线上抛出一个错误。 下面是重置令牌的获取处理程序

//get handler for reset token app.post('/reset/:token', function(req, res, next) { 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); }); }); }); }, function (token, user, done) { var options = { service: 'Mailgun', auth: { user: 'postmaster@Sandboxxxxxxxxxxx.mailgun.org', pass: 'xxxxxxxxxxxxxx' } }; var transporter = nodemailer.createTransport(smtpTransport(options)) var mailOptions = { to: user.email, from: 'postmaster@Sandbox65b418bcf76c4a5e909aedb7b6e87b45.mailgun.org', 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' }; transporter.sendMail(mailOptions, function(err) { req.flash('success', 'Success! Your password has been changed.'); done(err); }); } ], function(err) { res.redirect('/'); }); }); 

您在第一个waterwall任务中错误地调用了done函数。 第二个任务是期望两个参数: token, user和额外的callback。 但是你只传递一个参数: user

done函数中添加token参数:

  ... user.save(function(err) { req.logIn(user, function(err) { done(err, token, user); // TODO: initialize token }); }); ....