【问题标题】:order of the data is not proper nodejs数据顺序不正确nodejs
【发布时间】:2016-04-22 08:58:44
【问题描述】:

我对 nodejs 有点陌生。我正在构建一个类似 facebook 的应用程序。无论如何,我正在查询数据库,如代码所示。但是我在前端console.log的记录顺序是混乱的,不正确的,每次都不一样。你能告诉我我哪里弄错了吗?

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]);            
        };
    });
});

【问题讨论】:

  • 我看到的架构设计有点错误,你不应该有评论集合,你应该将 cmets 作为数组嵌入到 statuses 集合中,这样你会减少数量对数据库的大量请求
  • 但是mongodb文档的一行有一些大小限制,cmets可以一直增长。我说得通吗?
  • 是的,文档的阈值大小是 16mb,你应该得到很多 cmets 来制作它,无论如何你可以在 gridfs 中注册图像并且你的文档很少会超过 mb

标签: jquery node.js mongodb


【解决方案1】:

您应该使用 Promise.all 或 Promise + co 或 async/await 来使您的 aync 调用的结果按顺序排列。

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
    });
  })

});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-26
    • 2017-03-03
    • 1970-01-01
    • 1970-01-01
    • 2013-11-19
    • 1970-01-01
    • 2016-12-08
    相关资源
    最近更新 更多