2013-06-19 2 views
2

서로 의존하는 두 개의 데이터베이스 쿼리를 만들어야하는 인스턴스가 많이 있습니다.하지만 js의 비동기 특성으로 인해 이러한 쿼리 요청의 순서를 설정할 수 없습니다 . 내가 사용하고있는 작업은 다른 쿼리의 콜백에 쿼리 중 하나를 넣는 것입니다. 내 접근 방식은 작동하는 것처럼 보이지만이 작업을 수행하는 더 좋은 방법이 있는지 알고 싶습니다.Mongoose에서 Express가있는 두 개의 데이터베이스 쿼리

예제 코드 :

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

중복 : http://stackoverflow.com/questions/13243507/rendering-results-of-multiple-db-mongoose-queries-to-a-view-in-express-js – verybadalloc

답변

3

는 예, 중첩 콜백 문제를 해결하기 위해 많은 많은 흐름 제어 라이브러리가 있습니다. async 또는 nimble을 권장하지만 promises은이 문제를 해결하는 또 다른 인기있는 패턴입니다.

기본 진행은 당신이 코드를 추가하고 시간이 더 오래 더 깊은 시간이 지남에 중첩 얻을 수 있습니다 :

  • 거래를 코드 소량의 1 개 또는 2 중첩 수준. 그렇게 나쁘진 않네. 최상위라는 이름의 기능에
  • 추출 사물과
(약속 패턴에 따라 사용자 정의 API 중 하나 이상) 라이브러리를 사용 (대부분의 Node.js를 핵심 코드는이 지점을 넘어 얻을 수 없습니다 시도)를 호출

노드 위키에 long list of flow control modules이 있습니다. 당신은 또한 할 수 searchnpm