【发布时间】: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