2014-04-24 2 views
0

MongoJS (node.js mongodb wrapper)를 사용하여 두 개의 개별 모음을 조회하여 EJS를 사용하여 내보기와 함께 렌더링 할 오브젝트 배열을 작성하려고합니다.MongoDB 범위 지정 문제에서 다중 모음 쿼리하기

내가 겪은 문제는 범위 지정과 관련이있는 것 같습니다.

function getTeamMembers(projectID){ 

     var members = []; //<-- Instantiate the array of objects I want to return 

     Projects.findOne(
      { _id : mongojs.ObjectId(projectID) }, 
      function(error, result){ 

       /// Loop through the team to get the member's data 
       /// and push it on the members array 

       var team = result.team; //<-- This is an array of objects 

       for(var i = 0; i < team.length; i++){ 

        members[i] = {}; 
        members[i].accountID = team[i].accountID; 
        members[i].status = team[i].status; 

        Accounts.findOne(
          { _id : mongojs.ObjectId(team[i].accountID) }, 
          function(error, doc){ 

           /// The following line produces the error: 
           /// 'Cannot set property name of undefined' 
           members[i].name = doc.name; 

          } 
        ); 

       } 

       response.send(members); 

      } 
     ); 

    } 

내가 자식 기능을 사용할 수 있도록 올바른 자리에 members[] 배열을 인스턴스화하고 있습니다 있다고 생각하지만, 난 여전히이 오류 받고 있어요 :

TypeError: Cannot set property 'name' of undefined

답변

2

당신은 만들 필요를 findOne() 콜백이 실행될 때까지 루프는 이미 오랫동안 완료되었고 i=team.length이기 때문에 i의 현재 값을 캡처하는 범위입니다. 또한 이름이 채워지기 전에 응답을 보냅니다. async 모듈을 사용하여 처리 할 수 ​​있습니다.

:

for(var i = 0; i < team.length; i++){ 

    members[i] = {}; 
    members[i].accountID = team[i].accountID; 
    members[i].status = team[i].status; 

    Accounts.findOne(
      { _id : mongojs.ObjectId(team[i].accountID) }, 
      function(error, doc){ 

       /// The following line produces the error: 
       /// 'Cannot set property name of undefined' 
       members[i].name = doc.name; 

      } 
    ); 

} 

response.send(members); 

가된다 :

var async = require('async'); 

// .... 

async.each(team, function(teamItem, callback) { 
    var member = { 
    accountID: teamItem.accountID, 
    status: teamItem.status, 
    name: '' 
    }; 
    members.push(member); 

    Accounts.findOne(
      { _id : mongojs.ObjectId(member.accountID) }, 
      function(error, doc) { 
      if (error) 
       callback(error); 
      else { 
       member.name = doc.name; 
       callback(); 
      } 
      } 
); 
}, function(err) { 
    if (err) 
    response.send(500, err.toString()); 
    else 
    response.send(members); 
}); 
+0

에이스. @mscdex 감사합니다. 나는'비동기'에 익숙하지 않았다. 지금부터는 매우 편리 할 것 같습니다. – AJB