0

I want to fetch multiple result from MongoDB based on the some keys.

Below is my code:

router.get('/',function(req, res, next) {
    var movie = movieModel.find({category:"movies"});
    var sports =  movieModel.find({category:"sports"});
    var news =  movieModel.find({category:"news"});
    var cartoon =  movieModel.find({category:"cartoons"});
    var moviesData;
    var sportsData;
    var newsData;
    var cartoonData;

    movie.exec(function(err,data){
        if(err) throw err;
        console.log(data);
        moviesData  = data;
    });
    sports.exec(function(err,data){
        if(err) throw err;
        else {
            sportsData = data;
        }
    })
    news.exec(function(err,data){
        if(err) throw err;
        else {
            newsData = data;
        }
    })
    cartoon.exec(function(err,data){
        if(err) throw err;
        else{
            cartoonData = data;
        }
    })
    console.log(moviesData); // line  1
    console.log(sportsData);// line  2
    console.log(newsData);// line  3
    console.log(cartoonData);// line  4

    res.render('home', {admin:false,data:moviesData });
});

Here when I console the data inside the function (name.exec()) then it shows correct output , but when I console outside (like in line 1,line 2,line 3,line 4) it shows undefined.

Thomas Bormans
  • 5,156
  • 6
  • 34
  • 51

1 Answers1

1

Use the promise form of exec(), and async/await to save yourself from callback hell (which is otherwise documented in the canonical question How do I return the response from an asynchronous call?):

router.get("/", async function (req, res, next) {
  var moviesData = await movieModel.find({ category: "movies" }).exec();
  var sportsData = await movieModel.find({ category: "sports" }).exec();
  var newsData = await movieModel.find({ category: "news" }).exec();
  var cartoonData = await movieModel.find({ category: "cartoons" }).exec();
  console.log(moviesData);
  console.log(sportsData);
  console.log(newsData);
  console.log(cartoonData);
  res.render("home", { admin: false, data: moviesData });
});
AKX
  • 152,115
  • 15
  • 115
  • 172