【问题标题】:Passport.js -- how to use render email asynchronouslyPassport.js——如何使用异步渲染电子邮件
【发布时间】:2020-07-14 17:45:20
【问题描述】:

我正在使用 Sequelize/MariaDB 和 Passport.js 运行 Express 以进行用户身份验证。

我在注册部分(有效),但我似乎无法呈现并返回一封激活电子邮件,要求他们确认他们的电子邮件。

passport.js(包含认证策略)

passport.use('user-signup-email', new LocalStrategy({
    //Process/validate input, check database for existing emails, create user, add to database...

    ...
    if (newUser) {
        var token = jwt.sign( { data: newUser.id }, newUser.login_pass + "-" + newUser.account_created);
        var URLdata = { 
            id:                newUser.id,
            expiration_time:   Date.now() + 86400000,   //24 hours
            url:               token,
            email_info:        mail.createActivationEmail(req.app, newUser.login_key, newUser.user_alias, token)                        
        };

        console.log("info: " + URLdata.email_info);

        ... 
            //Store dynamic URL and email contents (in case of resending) in database with expiration time
            //And then send the email that was just rendered
    }

mail.js

exports.createActivationEmail = (app, recipientAddress, userName, url) => {
    app.render('emails/activation_email', {    
        layout: false,
        page_title: 'Please confirm your account!',
        dynamic_url: url
    }, function(err, rendered) {
        if (err) {
            console.log("Q [" + err + "]");
        }

        console.log("R " + rendered.toString());
        return {  
            from:       adminEmailAddress,
            to:         recipientAddress,
            cc:         false,
            bcc:        false,
            subject:    'Welcome to example.com ' + userName + '!',
            html:       rendered.toString(),
            text:       "TO DO" 
        };
    });
};

passport.js 中的最后一个 console.log 显示“信息:未定义”。 但是如果我在返回之前在mail.js模块中打印输出,那就没问题了。

我猜这是一个异步问题?我该如何解决?
在这种情况下,我对 promises 和 async-await 块还有些不清楚。

提前感谢您提供的任何帮助!

【问题讨论】:

  • 您正在混合异步代码和同步/阻塞代码执行。回调函数中的return {...} 是uselles。该对象永远无法从回调函数外部访问
  • 啊,现在看来很明显了,谢谢指出

标签: javascript node.js express async-await passport.js


【解决方案1】:

您误解了回调函数。 回调是(应该,当你写它们时)异步: https://nemethgergely.com/async-function-best-practices/ How to write asynchronous functions for Node.js

我更改了您的 createActivationEmail 函数。 最后一个参数现在是一个回调,它会在您的代码 app.redner 完成时被调用。

passport.use('user-signup-email', new LocalStrategy({
    //Process/validate input, check database for existing emails, create user, add to database...

    // ...
    if(newUser) {

        var token = jwt.sign({ data: newUser.id }, newUser.login_pass + "-" + newUser.account_created);
        mail.createActivationEmail(req.app, newUser.login_key, newUser.user_alias, token, (err, email_info) => {



            var URLdata = {
                id: newUser.id,
                expiration_time: Date.now() + 86400000,   //24 hours
                url: token,
                email_info
            };


            console.log("info: " + URLdata.email_info);

            //... 
            //Store dynamic URL and email contents (in case of resending) in database with expiration time
            //And then send the email that was just rendered


        });

    }

}));

exports.createActivationEmail = (app, recipientAddress, userName, url, done) => {
    app.render('emails/activation_email', {    
        layout: false,
        page_title: 'Please confirm your account!',
        dynamic_url: url
    }, function(err, rendered) {

        if (err) {
            console.log("Q [" + err + "]");
            cb(err);
            return;
        }

        console.log("R " + rendered.toString());
        
        done(null, {  
            from:       adminEmailAddress,
            to:         recipientAddress,
            cc:         false,
            bcc:        false,
            subject:    'Welcome to example.com ' + userName + '!',
            html:       rendered.toString(),
            text:       "TO DO" 
        });

    });
};

【讨论】:

  • 这是正确的,谢谢一百万!这让我发疯了
猜你喜欢
  • 2011-05-25
  • 2020-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-20
  • 2013-11-03
  • 2017-09-01
相关资源
最近更新 更多