2017-07-07 2 views
1

Je suis débutant dans le développement de meanstack. J'essaye de pousser la valeur à l'intérieur d'un tableau dans la boucle de foreach mais le dernier j'obtiens le tableau vide.node js Array.push() ne fonctionne pas avec mongo

Mon code:

router.get("/", function(req, res) { 

ourpackage.find({}).sort({_id:1}).exec(function(err,resdoc){ 

    var rest = []; 
    resdoc.forEach(function(doc){ 
    masterRoomimage.find({ourpackageId:doc._id},function(err,ourpackageimagevalue){ 
     if(err) res.send(err); 
     var ourpackagedetail = JSON.parse(JSON.stringify(doc)); 
     var stringifyimages = JSON.parse(JSON.stringify(ourpackageimagevalue)); 
     var ourpackage = _.merge({},ourpackagedetail,{masterRoomimages:stringifyimages}); 
     rest.push(ourpackageimagevalue); 
      //print all rest array value 
      console.log(rest); 
      }); 
    }); 
     //print empty rest array value 
     console.log(rest); 
     res.send(rest); 
    }); 
}); 

ourpackage Schéma

{ 
      "_id": "58e396d4215bc61338d2c06e", 
      "first_title": "test 1", 
      "berief_text": "<p>testing </p>", 
    } 

ourpackagesimages Schéma

[ 
      { 
       "_id": "59424d49fcc8100050916bf4", 
       "imageLocation": "first.jpg", 
       "ourpackageId": "58e396d4215bc61338d2c06e", 
       "__v": 0 
      }, 
      { 
       "_id": "59424d49fcc8100050916bf5", 
       "imageLocation": "third.jpg", 
       "ourpackageId": "58e396d4215bc61338d2c077", 
       "__v": 0 
      }, 
      { 
       "_id": "59490ad44e26c13324906433", 
       "imageLocation": "second.jpg", 
       "ourpackageId": "58e396d4215bc61338d2c06e", 
       "__v": 0 
      } 
    ] 

résultat attendu

[ 
    { 
     "_id": "58e396d4215bc61338d2c06e", 
     "first_title": "test 1", 
     "berief_text": "<p>testing </p>", 
     "ourpackagesimages": [ 
      { 
       "_id": "59424d49fcc8100050916bf4", 
       "imageLocation": "first.jpg", 
       "ourpackageId": "58e396d4215bc61338d2c06e", 
       "__v": 0 
      }, 
      { 
       "_id": "59490ad44e26c13324906433", 
       "imageLocation": "second.jpg", 
       "ourpackageId": "58e396d4215bc61338d2c06e", 
       "__v": 0 
      } 

     ] 
    } 
] 

sortie obtenue vide

[] 
+0

Attention: 'forEach' est synchrone alors que' find' est asynchrone. Je pense que l'utilisation de 'aggregate' comme indiqué dans cette [réponse] (https://stackoverflow.com/a/41744323/1022914) pourrait être utile pour vous. – Mikey

Répondre

0

Vous ne pouvez pas appeler une fonction asynchrone dans une fonction synchrone (forEach dans ce cas). Le résultat est accédé avant qu'il ne soit collecté et c'est pourquoi la sortie de tableau vide. Une bibliothèque très pratique et facile à utiliser est async. Pour votre cas d'utilisation particulier, map ou mapLimit fera l'affaire.

var async = require('async'); 

router.get("/", function(req, res) { 
    ourpackage.find({}).sort({ 
     _id: 1 
    }).exec(function(err, resdoc) { 

     async.mapLimit(resdoc, 5, function(doc, callback){ 
      masterRoomimage.find({ 
       ourpackageId: doc._id 
      }, function(err, ourpackageimagevalue) { 
       if (err) return callback(err); 

       var ourpackagedetail = JSON.parse(JSON.stringify(doc)); 
       var stringifyimages = JSON.parse(JSON.stringify(ourpackageimagevalue)); 
       var ourpackage = _.merge({}, ourpackagedetail, { 
        masterRoomimages: stringifyimages 
       }); 
       return callback(null, ourpackageimagevalue); 
      }); 

     }, function(err, rest) { 
      if(err){ 
       res.send(err); 
      } 
      else{ 
       res.send(rest); 
      } 
     }); 
    }); 
}); 
+0

Salut nom d'utilisateur: @TalhaAwan J'ai compris les fonctions asynchrones et synchrones toute autre solution ci-dessus mention sortie pour la fusion de deux collections (notre collection de paquets et notre collection d'imagespackage) – Senthil

+0

@Senthil, posez-vous une autre question? Désolé, je n'ai pas compris. Pourriez-vous élaborer? –

+0

merci pour votre réponse rapide. Ci-dessus j'ai mentionné schéma 1.ourpackages, schéma 2.ourpackageimages, enfin je veux la sortie attendue. – Senthil

0

simplement, déclarer un tableau reste = [];

rest[] = ourpackageimagevalue; 

J'espère que cela aide,

+0

Je reçois erreur ** SyntaxError: Jeton inattendu] ** – Senthil