2016-06-21 5 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:未定義は関数ではありません – Ritz

0

変数は同じスコープにありません。したがって、exec関数の外部ではnullです。あなたは正しい、それはjavascriptの非同期性に起因する。あなたは何ができるか

は、exec関数にコールバックを渡し、中にあなたの変数を渡している。

.exec(function(err, user, callback) 

してから、この

callback(friendsDetails); 

あなたの第二はconsole.logのようにそれを呼び出しません非同期であるため、関数が終了するまで待ちます。

+0

あなたは明確なアイデアを教えてください。私はノードjsに非常に新しいです – Ritz