Node.js node js-当函数依赖于内部的异步函数时,如何从函数返回值
我已经编写了一个发送电子邮件的NodeJS模块。该模块是NodeEmailer模块的包装器。当执行transporter.sendMail回调时,我希望我的包装函数在发送电子邮件时返回true,否则返回false。我该怎么做?代码如下: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
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);
});