节点js for循环无法访问变量,因此无法打印

时间:2019-04-01 15:19:48

标签: node.js

我正在使用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

如何在外部访问

3 个答案:

答案 0 :(得分:0)

您遇到的主要问题是Report.findUser.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);
    });
});