动态创建键值对数组(从 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 数据库中获取)的主要内容,如果未能解决你的问题,请参考以下文章