【问题标题】:Type error: done is not a function (nodemailer)类型错误:done 不是函数(nodemailer)
【发布时间】:2016-08-02 05:38:07
【问题描述】:

我将 nodemailer 用于忘记密码的应用程序,对于忘记密码的电子邮件会执行,但是当用户重置密码时,他们不会收到确认电子邮件。不知道为什么没有发生。

似乎在 done(err) 行上抛出错误。下面是重置令牌的获取处理程序

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

【问题讨论】:

    标签: node.js smtp mailgun nodemailer


    【解决方案1】:

    您在第一个水墙任务中错误地调用了done 函数。第二个任务需要两个参数:token, user 和额外的回调。但是你只传递了一个参数:user

    done函数中添加token参数:

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

    【讨论】:

      猜你喜欢
      • 2021-12-24
      • 2016-02-26
      • 2013-04-01
      • 2016-03-06
      • 2018-04-28
      • 2019-02-14
      • 2021-10-02
      • 2021-10-30
      相关资源
      最近更新 更多