使用Express在Mongoose中进行两次数据库查询

时间:2013-06-19 19:02:54

标签: javascript node.js mongodb mongoose

有很多实例我必须进行两个相互依赖的数据库查询。但是由于js的异步性质,我无法设置这些查询请求的顺序。我一直在使用的工作是将其中一个查询放在另一个的回调中。我的方法似乎有效,但我只是想知道是否有更好的方法来做到这一点?

示例代码:

app.get('/tweet', function(req,res){

  User.findOne({ twitterID: req.user.id },
    function(err, user) { 
        if (user){
             var votedPosts = user.votedPosts;
                Post.find(function (err, posts) {
                    if(posts){
                    for (var i = 0; i < posts.length; i++){
                        for (var j = 0; j < votedPosts.length; j++){
                          if(votedPosts[j]._id == posts[i]._id){
                            posts[i].votetype = votedPosts[j].votetype;
                          }
                          else{
                            console.log("this is getting called");
                            posts[i].votetype = 0;
                          }
                        }
                    }
                    res.send(posts);
                  }
                });
          }
    });
});

1 个答案:

答案 0 :(得分:3)

是的,有许多流控制库来解决深度嵌套的回调问题。我建议使用asyncnimble,但promises是解决此问题的另一种流行模式。

添加代码时的基本进程随着时间的推移变得越来越长并且嵌套得越来越深:

  • 使用少量代码处理1或2个嵌套级别。它并没有那么糟糕。
  • 将东西提取到顶级命名函数并调用它们(大多数node.js核心代码试图不超出这一点)
  • 使用库(自定义API或基于promises模式)

节点维基上有long list of flow control modules。您还可以search npm