所以,我正在尝试向用户发送电子邮件确认令牌,为此,我正在尝试使用crypto
模块生成令牌。我有这个:
var transport = this.NewTransport(), // This generates a nodemailer transport
token;
// Generates the token
require('crypto').randomBytes(48, function(ex, buf) {
token = buf.toString('hex');
});
// Uses nodemailer to send the message, with the token.
var message = {
from: 'test@email.com',
to: 'receiver@email.com',
subject: 'Token',
text: token,
html: token
};
transport.sendMail(message, function(err){
if(err) return res.send({s: 0});
return res.send({s: 1});
});
好吧,加密模块生成的令牌没有被分配给token variable
,我认为这是因为randomBytes
函数的异步性质。
我怎么能实际...将令牌保存在某处,以便我可以通过电子邮件发送它?或者我是否必须在randomBytes回调函数中包含所有电子邮件发送代码?这是否必须在节点中完成?还有其他方法,以便令牌及时生成,并实际发送?
抱歉,我对节点很陌生,有时候我仍然对回调感到困惑。感谢。
答案 0 :(得分:1)
您应该将代码包装在函数中。它使管理回调和同时维护代码变得更加容易。看看我如何重写你提供的内容...请记住,我还没有检查过代码,所以可能会有一些错误。
var crypto = require('crypto'),
transport = this.NewTransport(); // This generates a nodemailer transport
generateToken(sendMail);
function generateToken(callback) {
// Generates the token
var token;
crypto.randomBytes(48, function(ex, buf) {
token = buf.toString('hex');
if (typeof callback === 'function') {
callback(token);
}
});
}
function sendMail(token) {
// Uses nodemailer to send the message, with the token.
var message = {
from: 'test@email.com',
to: 'receiver@email.com',
subject: 'Token',
text: token,
html: token
};
transport.sendMail(message, function(err){
if(err) return res.send({s: 0});
return res.send({s: 1});
});
}