2017-08-23 9 views
-2

FORループ内でmongoose findクエリが実行されると、FORループが実行された後にIF文が必要になります。 nodejsが非同期なので、私は問題にぶつかります。マングースクエリを含むループに対して実行されるように、誰もがmooooseクエリが実行される前にFORループが実行された後のIF文

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: '[email protected]', 
       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'); 
      } 

     }); 
    } 
} 

}

IF文への流れを移動する前に、以下のコードの同期を行うことができます)。

+0

これは良いことです。つまり、javascriptが正常に動作していることを意味します。 –

+0

[Node mongoose find in loop in not loop]が重複している可能性があります(https://stackoverflow.com/questions/21829789/node-mongoose-find-query-in-loop-not-working) –

答えて

-1

forループ内には、Mongoose findOneがあります。これは非同期呼び出しです。したがって、forループは終了し、非同期呼び出しが終了する前にIfに移動します。

Mongooseの呼び出しにasync.eachのようなものを使用し、コールバックでIfの呼び出しを行う必要があります。

関連する問題