我正在使用Node js并使用sendmail函数
我声明了变量 htmlVal ,我尝试在外部访问,但仅打印未防御状态
function myFunction(){
var htmlVal;
Report.find({}, function (err, reports) {
if (err) return res.status(500).send("There was a problem finding the users.");
for(let reportData of reports){
User.find({name:reportData.name}, function (err, users) {
if (err) return res.status(500).send("There was a problem finding the users.");
for (let item of users) {
htmlVal = `<table width="100%" cellpadding="2" cellspacing="0" style="border-style:solid; border-width:1px; border-color:#000000;">
<tr width="100%" cellpadding="2" cellspacing="0">
<th style="text-align:center; border:1px solid #000; padding:10px;border-right:1px solid #000">Name</th>
</tr>
<tr width="100%" cellpadding="2" cellspacing="0">
<td style="text-align:center;padding:10px;border:1px solid #000">`+item.name+`</td>
</tr>
</table>`;
}
});
}
});
console.log(htmlVal);
const sendmail = require('sendmail')({
silent:true,
})
sendmail({
from: 'mymail@gmail.com',
to: 'mymail@gmail.com',
subject: 'Attendance of the Day',
html: htmlVal
}, function(err, reply) {
console.log(err && err.stack);
console.dir(reply);
})
}
我正在使用此htmlVal发送电子邮件,但仅发送空邮件
因为我无法在外部访问 htmlVal
如何在外部访问
答案 0 :(得分:0)
您遇到的主要问题是Report.find
和User.find
都是异步功能,但是您正在同步发送电子邮件。
换句话说,您是在呈现报告之前发送电子邮件。
在这种情况下,由于在Report.find
内有第二个异步查询和循环,您可能要使用async
库,然后将您的异步方法组合在一起。
了解eachSeries
函数,然后在Reports.find
回调中呈现您的html,而不是在调用Report.find
之后立即呈现。
答案 1 :(得分:0)
如果我的理解是正确的,那么即使在为变量赋值之前,您仍在使用htmlVar变量。
sendmail函数将在将值分配给htmlVar之前被调用,因为Report.find是异步函数。您需要将sendmail函数调用移到回调函数中,或者使用async / await。
答案 2 :(得分:0)
您需要这样的东西。
let htmlVal;
async.series([
function(callback) {
Report.find({}, function (err, reports) {
if (err) return res.status(500).send("There was a problem finding the users.");
async.eachSeries(reports, function (value, key, callbackFE) {
User.find({name:value.name}, function (err, users) {
if (err) return res.status(500).send("There was a problem finding the users.");
for (let item of users) {
htmlVal = `<html></html`;
}
callbackFE();
});
}, function (err) {
if (err) console.error(err.message);
callback(null, htmlVal);
});
});
}], function(err, htmlVal) {
console.log(htmlVal);
const sendmail = require('sendmail')({
silent:true,
})
sendmail({
from: 'mymail@gmail.com',
to: 'mymail@gmail.com',
subject: 'Attendance of the Day',
html: htmlVal
}, function(err, reply) {
console.log(err && err.stack);
console.dir(reply);
});
});