我尝试使用各种mongoDB文档填充一系列帖子。
app.get('/dash/:id', isLoggedIn, (req, res) => {
var posts = [];
User.findById(req.params.id, (err, user) => {
user.follows.forEach((followId) => {
User.findById(followId, (err, follow) => {
follow.posts.forEach((postId) => {
Post.findById(postId, (err, post) => {
posts.push(post);
})
})
})
})
})
console.log(posts)
})
我的问题是最终的console.log产生一个空数组,但如果我在将每个文档推入数组后立即调用console.log(posts),一切正常。我确定我失踪了一些愚蠢的东西。它是否在完成数据查找之前运行我的console.log?提前谢谢!
答案 0 :(得分:0)
mongoose的finById
是异步的,代码会在获取数据时执行其他内容(如console.log
),但它会返回一个promise,所以请使用它并避免回调你是不是拥有,你可以使用find()
条件,而不是在循环中多次调用多个findById()
,
我不知道你的架构是什么样的,但理想情况下你会使用populate来避免第二个.find()
并且可能会将ref
添加到posts
但是这里的建议基于你的帖子:
试试这个:
app.get('/dash/:id', isLoggedIn, (req, res) => {
User.findById(req.params.id).select('follows -_id') // this will return an array of follows
.then((follows) => {
return User.find({ _id : follows}).select('posts -_id') // this will retrun an array of posts Ids
})
.then((postsIds) => {
return Post.find({ _id : postsIds}); // these are your posts
})
.then((posts) => {
console.log(posts); // do stuff with posts here, res.render() maybe ?
})
});