难以循环通过mongoose数据

时间:2018-04-14 23:58:52

标签: javascript node.js mongodb mongoose

我尝试使用各种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?提前谢谢!

1 个答案:

答案 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 ?
    })

});