2017-08-23 19 views
0

mongoDBからデータをフェッチし、それらをコールバック関数外の配列形式のボットに格納しようとしています。Node.jsを使用して配列変数を空白にしています。私は以下のコードを説明しています。ここでNode.jsとMongoDBを使用してデータの配列を取得できません

exports.getCardDetails=function(req,res){ 
    var userid=req.body.userid; 
    var token_id=req.body.token_id; 
    var userData=[]; 
    db.f_user_login.find({_id: mongoJs.ObjectId(userid),token:token_id},function(err,doc){ 
     if (doc.length > 0) { 
      db.f_card_details.find({userid:userid},function(errs,docs){ 
       if (!errs) { 
        if (docs) { 
         for (var i = 0;i< docs.length;i++) { 
          var oemail=docs[i].email; 
          var id=docs[i]._id; 
          var name=docs[i].name; 
          var company=docs[i].company; 
          var position=docs[i].position; 
          var mobile=docs[i].mobile; 
          var landline=docs[i].landline; 
          var url=docs[i].url; 
          var postcode=docs[i].postcode; 
          var address=docs[i].address; 
          var isCurrentUser=docs[i].isCurrentUser; 
          db.f_user_profile.find({email:oemail},function(errs1,docs1){ 
           if (!errs1) { 
            if (docs1) { 
             for(var j=0;j < docs1.length;j++){ 
              var profileText=docs1[j].profiletext; 
              var biography=docs1[j].biography; 
              var image=docs1[j].file; 
              var profileid=docs1[j]._id; 
             } 
             var data={"id":id,"name":name,"company":company,"position":position,"mobile":mobile,"email":oemail,"landline":landline,"url":url,"postcode":postcode,"address":address,"profileText":profileText,"biography":biography,"image":image,"isCurrentUser":isCurrentUser,"profile_id":profileid}; 
             userData.push(data); 
            } 
           } 
          }) 
         } 
         console.log('user',userData); 
         var sdata={"statusCode": 200,"data":userData ,"message": "Your card details has been fetched successfully"}; 
         res.send(sdata); 
        } 
       } 
      }) 
     }else{ 
      var data={"statusCode": 404,"error": "Not Found","message":"Invalid User"}; 
      res.send(data); 
     } 
    }) 
} 

私はuserData配列にすべてのデータをプッシュし、応答としてではなく、ここで私の問題は、ループ内のすべてのデータがその配列にプッシュされているが、応答として、それらのデータを送信中にconsole.log('user',userData);が空白表示されるものを送信しようとしています。私はそれらのデータを応答として送る必要があります。

+2

これは私の目を燃やしています。そのクエリを簡略化する方法が必要です。あなたはリファクタリング中にあなたの問題を見つけて、この機能を見なければならないかもしれない次の人を救う機会があります。 – axlj

+0

ヒント:これは非同期コールバックの問題です。上記のループが終了する(または開始する)前に 'res.send(sdata)'を呼び出しています。 – axlj

+0

はい、私はsettimeout関数を使ってそれを解決しました。 – satya

答えて

-1

userDataはdb.f_user_profile.findコールバックに記入されています。ここではres.send(sdata);も移動する必要があります。また、node7を使用している場合、async/awaitに変換することをお勧めします。

exports.getCardDetails = async function(req,res){ 
    var userid=req.body.userid; 
    var token_id=req.body.token_id; 
    var userData=[]; 
    const user = await db.f_user_login.find({_id: mongoJs.ObjectId(userid),token:token_id}).next(); 
    if(user) { 
     const cards = await db.f_card_details.find({userid:userid}).toArray(); 

     for (var i = 0;i < cards.length;i++) { 
     var email=docs[i].email; 
     var id=docs[i]._id; 
     var name=docs[i].name; 
     var company=docs[i].company; 
     var position=docs[i].position; 
     var mobile=docs[i].mobile; 
     var landline=docs[i].landline; 
     var url=docs[i].url; 
     var postcode=docs[i].postcode; 
     var address=docs[i].address; 
     var isCurrentUser=docs[i].isCurrentUser; 
     const profiles = await db.f_user_profile.find({email}).toArray(); 
     for(var j=0; j < profiles.length;j++) { 
      var profileText=docs1[j].profiletext; 
      var biography=docs1[j].biography; 
      var image=docs1[j].file; 
      var profile_id=docs1[j]._id; 
      var data={id,name,company,position,mobile,email,landline,url,postcode,address,profileText,biography,image,isCurrentUser,profileid}; 
      userData.push(data) 
     } 
    } 
    console.log('user',userData); 
    var sdata={"statusCode": 200,"data":userData ,"message": "Your card details has been fetched successfully"}; 
    res.send(sdata); 
    } else { 
     var data={"statusCode": 404,"error": "Not Found","message":"Invalid User"}; 
     res.send(data); 
    } 
} 
関連する問題