Node.js node js-当函数依赖于内部的异步函数时,如何从函数返回值

Node.js node js-当函数依赖于内部的异步函数时,如何从函数返回值,node.js,nodemailer,Node.js,Nodemailer,我已经编写了一个发送电子邮件的NodeJS模块。该模块是NodeEmailer模块的包装器。当执行transporter.sendMail回调时,我希望我的包装函数在发送电子邮件时返回true,否则返回false。我该怎么做?代码如下: var nodemailer = require('nodemailer'); module.exports.sendEmail = function (mailerAddress, mailerPassword, to, subject, html) { v

我已经编写了一个发送电子邮件的NodeJS模块。该模块是NodeEmailer模块的包装器。当执行transporter.sendMail回调时,我希望我的包装函数在发送电子邮件时返回true,否则返回false。我该怎么做?代码如下:

var nodemailer = require('nodemailer');

module.exports.sendEmail = function (mailerAddress, mailerPassword, to, subject, html) {
var transporter, mailOptions;

transporter = nodemailer.createTransport({
    service: 'Gmail',
    auth: {
        user: mailerAddress,
        pass: mailerPassword
    }
}); 

mailOptions = {
    from: mailerAddress, 
    to: to,
    subject: subject,
    html: html
};

transporter.sendMail(mailOptions, function(error, info) {
    if (error) {
        return false;
    }
    else {
        return true;
    }
});         
};
如果我理解的话,你说的“包装函数”就是回调函数,所以如果我是对的,试着这样做:

var EmailUtil = {
    sendEmail : function sendEmail(mailerAddress, mailerPassword, to, subject, html, callback) {
        var options = {
            service: 'Gmail',
            auth: {
                user: mailerAddress,
                pass: mailerPassword
            }
        };
        var transport = nodemailer.createTransport(options);

        transport.sendMail({
            from: mailerAddress, 
            to: to,
            subject: subject,
            html: html
        }, function(err, responseStatus) {
            var val;
            if (error) {
                val = false;
            } else {
                val = true;
            }
            callback(error, val);
        });
    }
};

module.exports = EmailUtil;

这是我在生产中使用的一个真实示例。

我认为您不应该这样做,因为您实际上是在尝试将异步操作转换为同步操作。如果您有意这样做,那么我建议您看看这个答案,它使用
async


您还可以利用:

模块 应用程序
你试过那个密码吗?你得到了什么错误?没有错误,问题是我无法从包装器函数返回真或假。为什么这样写
sendmail:function sendmail
?@JonatasWalker这是一个很长的答案。。。简而言之:1-我喜欢按职责对功能进行分组,例如
EmailUtil
EmailOperations
,因此在
EmailUtil
内部我可以创建
isEmailValid(…)
CheckEmailLength(…)
EmailOperations
内部我可以创建
sendEmail(…)等功能
删除电子邮件(…)
。2-写更少的
模块。导出
声明,因为分组。3-关注点分离。4-还有一点个人偏好:)当然,我们可以用很多方法来做到这一点,你的答案就是另一种方法的例子。干杯这里是对回调、承诺和异步/等待的一个很好的参考:。视频回购协议
module.exports.sendMail = function(mailOptions) {
  var transporter = ....;
  return new Promise(function(resolve, reject) {
    transporter.sendMail(mailOptions, function(error, info) {
      if (error) {
        reject(error);
      } else {
        resolve(info);
      }
    });
  });
};
var module = require('...');
var mail = {
  to: '...',
  from: '...'
};
module.sendMail(mail).then(function(response) {
  console.info(response);
}).catch(function(error) {
  console.info(error);
});