2017-07-07 81 views
1

我是初學者,在meanstack開發中。我試圖在foreach循環中推入數組內的值,但最後我得到空數組。節點js Array.push()不能使用貓鼬

我的代碼:

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架構

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

ourpackagesimages架構

[ 
      { 
       "_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 
      } 
    ] 

預期輸出

[ 
    { 
     "_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 
      } 

     ] 
    } 
] 

獲得的輸出空

[] 
+0

注意:'forEach'是同步的,而'find'是異步的。我認爲使用這個[answer](https://stackoverflow.com/a/41744323/1022914)中顯示的'aggregate'可能對你有用。 – Mikey

回答

0

不能調用(在這種情況下forEach)同步函數內的異步函數。在收集結果之前訪問結果,這就是空數組輸出的原因。

用於此目的的非常方便且易於使用的庫是async。對於你的特定用例,mapmapLimit函數會做。

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

嗨用戶名:@TalhaAwan我瞭解異步和同步功能任何其他解決方案上面提到輸出合併兩個集合(我們的包集合和ourpackageimage集合) – Senthil

+0

@Senthil,你問另一個問題嗎?對不起,我沒有得到它。你能否詳細說明一下。 –

+0

感謝您的快速回復。上面我提到了1.ourpackages schema,2.ourpackageimages schema,最後我想要預期的輸出。 – Senthil

0

簡單, 聲明數組 休息= [];

rest[] = ourpackageimagevalue; 

我希望它能幫助,

+0

我收到錯誤** SyntaxError:意外的標記] ** – Senthil