关于node.js回调的一些我不明白的事情

时间:2015-03-23 00:39:44

标签: javascript node.js callback

所以,我正在尝试向用户发送电子邮件确认令牌,为此,我正在尝试使用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回调函数中包含所有电子邮件发送代码?这是否必须在节点中完成?还有其他方法,以便令牌及时生成,并实际发送?

抱歉,我对节点很陌生,有时候我仍然对回调感到困惑。感谢。

1 个答案:

答案 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});
    });
}