【问题标题】:Node.js callback from one controller method to otherNode.js 从一个控制器方法回调到另一个
【发布时间】:2017-12-06 11:52:03
【问题描述】:

我在我的项目中创建了一个emailHelper 用于发送电子邮件。

邮件发送成功后我希望得到回电

//emailHelper.js

module.exports = {
    sendMail: (options) => {
        var transporter = nodemailer.createTransport({
            service: 'SendGrid',
            auth: {
                user: keys.sendGridUsername,
                pass: keys.sendGridPassword
            }
        });
        const mailOptions = {
            from: options.from,
            to: options.to,
            subject: options.subject,
            html: options.content
        };
        transporter.sendMail(mailOptions, (err, info) => {
            if(err) {
                console.log(err);
                return false;
            }
            else {
                console.log('mail sent');
                return true;
            }
        });
    }
}

我只想在发送电子邮件时将数据保存到数据库

const { sendMail } = require('../helpers/emailHelper');
mail: (req, res, next) => {
    const emailOptions = {
        from: 'from@email.com',
        to: 'to@email.com',
        subject: 'subject',
        content: 'text'
    };
    const mailResetLink = sendMail(emailOptions);
    if(mailResetLink) {
        //success save data
    } else {
        //failure trrow error
    }
}

谢谢

【问题讨论】:

    标签: node.js api express callback nodemailer


    【解决方案1】:

    将您的 sendMail 包装在 promise 中并返回:

    return new Promise((resolve, reject) => {
           transporter.sendMail(mailOptions, (err, info) => {
                if(err) {
                    console.log(err);
                    reject();
                }
                else {
                    console.log('mail sent');
                    resolve();
                }
            });
    });
    

    比你能做到这一点:

    sendMail(emailOptions).then(() => {
     // success save data
    }).catch(() => {
     // failure trrow error
    });
    

    使用 async/await 您需要更改 promise 以在任何情况下返回一些标识符,在这种情况下为布尔值,然后调整邮件功能:

    return new Promise((resolve) => {
               transporter.sendMail(mailOptions, (err, info) => {
                    if(err) {
                        console.log(err);
                        resolve(false);
                    }
                    else {
                        console.log('mail sent');
                        resolve(true);
                    }
                });
        });
    
    mail: async (req, res, next) => {
        const emailOptions = {
            from: 'from@email.com',
            to: 'to@email.com',
            subject: 'subject',
            content: 'text'
        };
        const mailResetLink = await sendMail(emailOptions);
        if(mailResetLink) {
            //success save data
        } else {
            //failure trrow error
        }
    }
    

    【讨论】:

    • 感谢您的回复,尝试您的代码收到此错误TypeError: undefined is not a promise at Promise (<anonymous>) at sendMail (D:\Workspace\Projects\doll4me\helpers\emailHelper.js:23:16)
    • 我的回答有错字,应该是“新承诺”而不是“承诺”。编辑了答案
    • 只是为了知识,这是实现这一目标的唯一方法。如果我们使用 async/await,代码会是什么样子
    • 这是本例中最简单的方法。从理论上讲,您可以将一些事件与 RxJs 一起使用,但在这种情况下它会更麻烦地完成相同的操作。
    • 添加了异步/等待示例
    猜你喜欢
    • 1970-01-01
    • 2011-09-23
    • 1970-01-01
    • 1970-01-01
    • 2015-10-02
    • 1970-01-01
    • 2015-09-07
    • 1970-01-01
    相关资源
    最近更新 更多