2016-09-26 1 views
0
router.get('/getChefMeals/:uid', function(req, res, next) { 
    var userid = req.params.uid; 
    var allMealsIds = []; 
    var allMeals = []; 

    console.log("inside the getChefMeals/UID"); 
    console.log("the uid is " + userid); 

    db.ref("chefs/" + userid).child("meals").once("value",function(dataSnapShot){ 
     dataSnapShot.forEach(function(snap){ 
      allMealsIds.push(snap.getKey()); 
     }); 
     allMealsIds.forEach(function(obj){ 
      console.log("obj should be key of meals " + obj); 
      db.ref("meals/" + obj).once("value",function(dataSnapShot){ 
       // console.log("dataSnapShot is " + dataSnapShot); 
       console.log("dataSnapShot key is " + dataSnapShot.getKey()); 
       console.log("value is " + dataSnapShot.val()); 
       allMeals.push({meal: dataSnapShot.val(), key: dataSnapShot.getKey()}); 
      }); 
     }); 
     console.log("Outside allmealsloop length",allMeals.length); 
     res.render("detail_chef.ejs",{chefMeals: allMeals});  
    }); 
}); 

、私はJSONの配列detail_chefejsファイルに直接オブジェクトであるallMealsres.renderオブジェクトをしようとしています。ただし、ejsファイルでは未定義です。Express Rendering ArrayオブジェクトはEJSでは未定義です。非同期発行上記のコードブロックに

console.log起因明示ルータの非同期の性質のために、第二の最後の行からconsole.log("Outside allmealsloop length",allMeals.length);は0

の長さを返しうまくとallMeals Firebase DB console.log戻り、すべてのデータが持つ配列であることを示し正しい長さ。

ejsにこの配列をどのように渡すことができますか?allMeals

答えて

0

食事を1つずつ取得する代わりに、コンセプトで$のような1つのクエリですべての食事を取得し、すべての食事を取得した後にそのコールバックから応答を送信する必要があります。

あなたが今行っているのと同じアプローチに従わなければならない場合は、再帰を使用するか、allMealsの長さとallMealIdsの長さが同じであるときにそれらをejsに送信してください。

router.get('/getChefMeals/:uid', function(req, res, next) { 
    var userid = req.params.uid; 
    var allMealsIds = []; 
    var allMeals = []; 

    console.log("inside the getChefMeals/UID"); 
    console.log("the uid is " + userid); 



    db.ref("chefs/" + userid).child("meals").once("value",function(dataSnapShot){ 
     dataSnapShot.forEach(function(snap){ 
      allMealsIds.push(snap.getKey()); 
     }); 
     allMealsIds.forEach(function(obj){ 
      console.log("obj should be key of meals " + obj); 
      db.ref("meals/" + obj).once("value",function(dataSnapShot){ 
       // console.log("dataSnapShot is " + dataSnapShot); 
       console.log("dataSnapShot key is " + dataSnapShot.getKey()); 
       console.log("value is " + dataSnapShot.val()); 
       allMeals.push({meal: dataSnapShot.val(), key: dataSnapShot.getKey()}); 
if(allMeals.length === allMealIds.length){ 
     res.render("detail_chef.ejs",{chefMeals: allMeals});  

} 
      }); 
     }); 
     console.log("Outside allmealsloop length",allMeals.length); 
    }); 
}); 

ただし、すべての食事を1つのクエリで取得することをおすすめします。

関連する問題