2016-04-21 89 views
0

我对nodejs有点新。我正在构建一个类似Facebook的应用程序。无论如何,我正在查询代码中显示的数据库。但前端记录I console.log的顺序混乱而且不合适,每次都不一样。你能告诉我我错在哪里吗?数据的顺序不正确nodejs

router.get('/home', isAuthenticated, function(req, res){ 
    var friendsIds = req.user.friends; 
    friendsIds.push(req.user.id); 
    var cbdone = 0; 

    Status.find({statuserId : {$in: friendsIds}}, null, {skip : 0, limit: 5, sort: {_id: -1}}, function(err, statuses) { 

     for (var i = 0; i < statuses.length; i++) { 
      (function(currStatus){ 
       var currentStatus = currStatus; 
       var a = currentStatus._id.getTimestamp(); 
       if(currentStatus.likedBy){ 
        if (currentStatus.likedBy.indexOf(req.user.id) > -1) { 
         currentStatus.isLiked = true; 
        }; 
        currentStatus.likersCount = currentStatus.likedBy.length; 
       } else { 
        currentStatus.isLiked = false; 
        currentStatus.likersCount = 0; 
       } 

       Comment.find({statusId : currentStatus.id}, null, {sort: {_id: -1}}, function(err, comments){ 
        for (var i = comments.length - 1; i >= 0; i--) { 
         comments[i].likersCount = comments[i].likedBy.length; 
         comments[i].isLiked = comments[i].likedBy.indexOf(req.user.id) > -1; 
        }; 
        currentStatus.comments = comments; 
        cbdone++; 
        if(cbdone === statuses.length){ 
         res.render('home2', { 
          user: req.user, 
          statuses: statuses 
         }); 
        } 
       }); 

      })(statuses[i]);    
     }; 
    }); 
}); 
+0

我看到的是一些错误的模式设计,你不应该有注释集合,你应该将注释作为一个数组嵌入到状态集合中,这样你将减少请求的数量数据库剧烈 –

+0

但是一行mongodb文档有一些大小限制,评论可以不断增长。我有道理吗? –

+0

是的,文档的阈值大小是16mb,你应该得到很多评论来做它,任何方式你会注册在网格中的图像,你的文件很少会超过MB –

回答

0

您应该使用Promise.all或Promise + co或async/await按顺序进行异步调用的结果。

Status.find({statuserId : {$in: friendsIds}}, null, {skip : 0, limit: 5, sort: {_id: -1}}, function (err, statuses) { 
    co(function *() { 
    const Comments = yield statuses.map(function (currentStatus) { 
     var currentStatus = currStatus; 
     var a = currentStatus._id.getTimestamp(); 
     if(currentStatus.likedBy){ 
     if (currentStatus.likedBy.indexOf(req.user.id) > -1) { 
      currentStatus.isLiked = true; 
     }; 
     currentStatus.likersCount = currentStatus.likedBy.length; 
     } else { 
     currentStatus.isLiked = false; 
     currentStatus.likersCount = 0; 
     } 
     return new Promise(function (resolve, reject) { 
     Comment.find({statusId : currentStatus.id}, null, {sort: {_id: -1}}, function(err, comments){ 
      if(err) return reject(err); 
      for (var i = comments.length - 1; i >= 0; i--) { 
      comments[i].likersCount = comments[i].likedBy.length; 
      comments[i].isLiked = comments[i].likedBy.indexOf(req.user.id) > -1; 
      }; 
      resolve(comments); 
     }); 
     }) 
    }); 
...... 
    res.render('home2', { 
     user: req.user, 
     statuses: statuses 
    }); 
    }) 

});