动态创建键值对数组(从 mongoDB 数据库中获取)

Posted

技术标签:

【中文标题】动态创建键值对数组(从 mongoDB 数据库中获取)【英文标题】:Creating an array of key-value pairs(fetched from a mongoDB database) dynamically 【发布时间】:2015-05-16 19:27:40 【问题描述】:

我正在尝试以动态方式创建一个 key-value 对数组。 values 部分是从我的routes 内的数据库中获取的。这就是我正在做的事情。

   router.get('/account',isAuthenticated, function(req,res)
   var following_users_details = [];

    for (var i = 0;i<req.user.following_users.length;i++)
    
        var following_user = req.user.following_users[i];// following_users is a field of Array type in my MongoDB database 
        User.findOne('username' : following_user ,
            function(err,user)
            
                following_users_details.push(
                    username: user.username,
                    profilepic : user.photo,
                    userbio : user.bio
                );
            );
    
    res.render('users/userAccount',user:req.user, following_users_details:following_users_details );
);

但是当我尝试打印我的 key-value 对数组时,我什么也得不到。

for(var i = 0;i<following_users_details.length;i++)

    console.log("Username = "+following_users_details[i].username);
    console.log("Username = "+following_users_details[i].profilepic);
    console.log("Username = "+following_users_details[i].userbio);

当我尝试打印数组时,控制台上没有任何输出。我想我错过了一些非常明显的东西。这是创建数组的正确方法还是我做错了?

附: - 我已经经历过this、this和this,但这些都没有直接解决我的问题。

【问题讨论】:

从代码中看不出什么,你能在function(err,user)..的开头放一个console.log(JSON.stringify(user))行来检查从MongoDB返回的用户文档吗? 猜是因为从数据库中获取是异步操作 @chridam 正在返回用户文档。这不是null。我查过了。 @marsh 好的,我明白了。有什么方法可以实现吗? 【参考方案1】:

findOne 中的回调在未来发生,它是异步的。您必须在所述回调中呈现数据才能存在。

   User.findOne('username' : following_user ,
        function(err,user)
        
            following_users_details.push(
                username: user.username,
                profilepic : user.photo,
                userbio : user.bio
            );
            res.render('users/userAccount',user:req.user, following_users_details:following_users_details );
        );

【讨论】:

如果我这样做,我会得到另一个错误。 Can't set headers after they are sent。还有其他方法吗?【参考方案2】:

有几件事,首先是您的 console.log 在它们来自 db 之前发生。

其次,更好的是,不要为每个用户进行所有不必要的调用,只需调用一次即可。

router.get('/account',isAuthenticated, function(req,res)
  var following_users_details = [];

  User.find(
    username:
      $in: req.user.following_users // assuming this is an array
  , 
    // select options. This might be done differently though,
    // depending on your MongoDB driver/ORM
    username: true,
    profilepic: true,
    userbio: true
  ,
  // callback
  function (err, followedUsers) 
    // only now you have access to users, not before. Now log/send them
    if (err) /* handle DB error */

    res.render('users/userAccount',
      user:req.user,
      following_users_details: followedUsers
    );
    // also log them to console.
    followedUsers.forEach(function(followedUser) 
       console.log(JSON.stringify(followedUser, null, 2);
    );
  );
);

【讨论】:

以上是关于动态创建键值对数组(从 mongoDB 数据库中获取)的主要内容,如果未能解决你的问题,请参考以下文章

用 Javascript 中的键值对重构对象数组并输出或发出它以用 mongoose 和 MongoDB 保存它?

从 sql BigQuery 中的数组对象中获取键值对

mongodb如何删除集合中的指定键值对???

MongoDB简单使用

创建键值对的数组列

如何动态创建字典和添加键值对?