【问题标题】:IF statement after FOR loop is executed before mongoose query is exceuted执行 mongoose 查询之前执行 FOR 循环后的 IF 语句
【发布时间】:2018-02-01 07:55:10
【问题描述】:

我希望在 FOR 循环之后执行 IF 语句,一旦 FOR 循环内的 mongoose find 查询运行。由于nodejs是异步的,我遇到了问题。任何人都可以使以下代码同步,以便在将流程移动到 IF 语句之前执行包括猫鼬查询的 FOR 循环

app.post('/success', function (req, res) {

var seatLength = req.body.seatNo;
var ageList = req.body.age;
var nameList = req.body.name;
var emailData = req.body.email;
var dataG = req.body.dateOfJourney;
var emailArray = [];
var bookedAlready = false;
var bookedSeats = [];
for (var i = 0; i < req.body.seatNo.length; i++) {

    var pname = req.body.name[i];
    var page = req.body.age[i]
    busModel.findOne({$and: [{"ticket.seatNumber": req.body.seatNo[i]}, {"dateOfJourney": dataG}, {"ticket.reserved": false}]}, function (err, doc) {


        if (doc) {
            doc.ticket[0].reserved = true;
            doc.ticket[0].passengerName = pname;
            doc.ticket[0].passengerAge = page;
            doc.ticket[0].passengerEmail = req.body.email;
            doc.ticket[0].passengerContact = req.body.contact;


            doc.save(function (err) {
                if (err) {
                    console.log('error');

                }
                else {
                    console.log("no error");
                    console.log(req.body.seatNo[i]);
                    bookedSeats.push(req.body.seatNo[i]);

                }
            })

        }
        else {
            console.log('error');
        }


    });

}

if (bookedSeats.length == seatLength.length) {
    emailArray.push(i);
    ejs.renderFile(__dirname + "/views/test.ejs", {
        seat: seatLength,
        name: nameList,
        age: ageList
    }, function (err, data) {
        if (err) {
            console.log(err);
        }
        else {

            let HelperOptions = {
                from: 'padinkit@gmail.com',
                to: emailData,
                subject: 'Hello World !',
                html: data
            };
            transporter.sendMail(HelperOptions, function (error, info) {
                if (error) {
                    console.log(error);
                }
                //console.log('mail sent');
                console.log(info);
            });

        }

    });
    res.send("hi")


}
if (bookedSeats.length != seatLength.length) {
    for (i = 0; i < bookedSeats.length; i++) {
        busModel.findOne({$and: [{"ticket.seatNumber": req.body.seatNo[i]}, {"dateOfJourney": dataG}, {"ticket.reserved": true}]}, function (err, doc) {
            if (doc) {
                doc.ticket[0].reserved = false;
                doc.ticket[0].passengerName = null;
                doc.ticket[0].passengerAge = null;
                doc.ticket[0].passengerEmail = null;
                doc.ticket[0].passengerContact = null;


                doc.save(function (err) {
                    if (err) {
                        console.log('error');

                    }
                    else {
                        console.log("seats which were reserved during exception" + req.body.seatNo[i]);

                    }
                })

            }
            else {
                console.log('error');
            }

        });
    }
}

});

【问题讨论】:

标签: node.js express mongoose


【解决方案1】:

在你的 for 循环中是 Mongoose findOne。那是一个异步调用。因此,for 循环将在异步调用完成之前完成并移至 If。

您应该对 Mongoose 调用使用 async.each 之类的东西,然后在回调中使用 If 调用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-24
    • 1970-01-01
    • 2021-04-25
    • 1970-01-01
    • 2019-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多