2016-06-21 2 views
0

여기 내 코드입니다. 내 friends.friendsList에 대한 세부 정보를 얻으려고하고 있는데 사용자 컬렉션 자체 내에 있으며 사용자의 ID를 삽입하고 있습니다. 그래서 먼저 userId를 가져 와서 각 내용을 가져옵니다.하지만 내 문제는 fetchDetails 함수 외부에서 friendsDetails의 값을 가져 오지 못합니다. 나는 많은 시간을 보냈다. 나는 노드와 돛 js를 처음 사용합니다. 나는 비동기 실행의 문제라고 생각한다. 이 문제를 어떻게 해결할 수 있습니까?노드 js의 forloop 콜백 문제

getFriendsDetails:function(req,res){ 
     var userId = req.param('id'); 
     var friendsDetails=[]; 
     User.findOne({ 
      id: userId 
     }).exec(function(err,user){ 
      var friendsIds=user.friends; 
      friendsIds.forEach(function(id){ 

       User.findOne({ 
         id: id 
        }).exec(function fetchDetails(err,Userdetails){ 

         var obj={ 
          id:Userdetails.id, 
          name:Userdetails.name, 
          pro_pic:Userdetails.profile_pic 
         } 
         friendsDetails.push(obj); 

         console.log(friendsDetails);//Here consoling pushed data correctly. 

        }); 
        console.log(friendsDetails);//here i am getting null array 


      }); 
     }); 

답변

0

당신은 친구 문서의 배열을 얻기 위해 MongoDB를 $in 절을 사용할 수 있습니다.

getFriendsDetails:function(req,res){ 
    var userId = req.param('id'); 
    var friendsDetails=[]; 
    User.findOne({ 
     id: userId 
    }).exec(function(err,user){ 
     var friendsIds = user.friends; 

     User.find({id : { $in : friendsIds}}).toArray(function(err, data){ 
      console.log(data); 

      data.forEach(function(friendObj){ 
       var obj={ 
        id: friendObj.id, 
        name: friendObj.name, 
        pro_pic: friendObj.profile_pic 
       } 
       friendsDetails.push(obj); 
      }); 
      console.log(friendsDetails); 
     }); 

    }); 
} 
+0

오류 발생 \ sails-mongo \ node_modules \ mongodb \ lib \ utils.js : 98 process.nextTick (function() {throw err;}); ^ TypeError : undefined가 함수가 아닙니다. – Ritz

0

변수가 동일한 범위에 있지 않습니다. 따라서 exec 함수 외부에서는 null입니다. 당신 말이 맞아요, 자바 스크립트의 비동기 성질 때문입니다. 당신이 할 수있는 일

는 간부 함수에 콜백을 통과에 변수를 전달합니다.

.exec(function(err, user, callback) 

다음이

callback(friendsDetails); 

두 번째 CONSOLE.LOG과 같이 호출하지 않습니다 비동기이기 때문에 함수가 끝날 때까지 기다리십시오.

+0

당신은 명확한 아이디어를 줄 수 있습니까? 나는 노드 j에 대해 매우 새롭습니다. – Ritz