2016-06-20 117 views
0

我一直在爲此奮鬥了幾天。我試圖返回由ID列表引用的數據。爲什麼我的Mongoose查詢在循環中只返回第一個結果?

一個團隊的例子JSON:

{ 
    "Name":"Team 3", 
    "CaptainID":"57611e3431c360f822000003", 
    "CaptainName":"Name", 
    "DateCreated":"2016-06-20T10:14:36.873Z", 
    "Members":[ 
     "57611e3431c360f822000003", //Same as CaptainID 
     "57611e3431c360f822000004" //Other members 
    ] 
} 

這裏是路線:

router.route('/teams/:user_id') 
.get(function (req, res) { 

    TeamProfile.find({ 
     Members : { 
      $in : [req.params.user_id] 
     } 
    }).exec(function (err, teamProfiles) { 

     teamProfiles.forEach(function (teamProfile) { 

      UserProfile.find({ 
       UserID : { 
        $in : teamProfile.Members.map(function (id) { 
         return id; 
        }) 
       } 
      }, function (err, userProfiles) {   
       teamProfile.Members = userProfiles; 
       console.log(teamProfile); //will console log the remaining 2 
      }) 
      .exec(function (err) {    
       res.json(teamProfile) //returns the first one only 
      }) 
     }) 
    }); 
}) 

的想法是隻使用ID來獲取先進返回配置文件的路徑日期數據。

但是,它正在努力。它獲取用戶信息和所有用戶信息,但不會返回代碼中評論的所有用戶組和所有用戶。總共有3支隊伍。只有第一個被返回。如果我刪除res.json(teamProfile)它控制檯記錄所有3個團隊。我想要返回所有3支球隊。

+0

使用異步函數獲取結果 –

回答

3

這是因爲您的響應在完成所有數據庫操作之前被調用。因此而不是每個使用async.forEach函數。安裝異步模塊

var async = require('async'); 
router.route('/teams/:user_id').get(function (req, res) { 

TeamProfile.find({ 
    Members : { 
     $in : [req.params.user_id] 
    } 
}).exec(function (err, teamProfiles) { 

    async.forEach(teamProfiles,function (teamProfile,cb) { 

     UserProfile.find({ 
      UserID : { 
       $in : teamProfile.Members.map(function (id) { 
        return id; 
       }) 
      } 
     }, function (err, userProfiles) {   
      teamProfile.Members = userProfiles; 
      cb() // Callback 
     }) 

    },function(){ 
     res.json(teamProfiles) 
    }) 
}); 
}) 
+0

謝謝!我知道它與完成所有操作有關。你的答案有一個小錯字。它是_res.json(teamProfiles)_。讓我的一天! :) – Poot87