FIrebase"推动"对象到数组不起作用

时间:2017-11-04 03:44:53

标签: javascript arrays node.js firebase firebase-realtime-database

app.get('/zones/:id/experiences', function(req,res) {
  var zone_key = req.params.id;
  var recent = [];
  var ref = firebase.database().ref('participants/'+zone_key+'/experiences');
  ref.on("value", function(snapshot) {
    snapshot.forEach((snap) => {
      firebase.database().ref('experiences').child(snap.val()).once("value").then((usersnap) => {
        recent.push(usersnap.val());
      });
    });
  console.log(recent);
  });
  res.render('experiences',{key: zone_key, list: recent});  
});

在上面的代码中,我正在查询参考点以获得一组"键"。然后,对于每个键,我查询另一个参考点以获取与该键关联的对象。然后,对于为这些键返回的每个对象,我只想将对象推送到列表中。然后,我想将此列表传递给客户端站点,以使用呈现来处理数据。

出于某种原因,recent []永远不会被填充。它仍然是空的。这是我的变量不在范围内的问题吗?我控制台登录以检查参考点返回的数据是什么,一切都很好,我得到了我想要的数据。

P.S嵌套这样的查询好吗? For for loop in another query

1 个答案:

答案 0 :(得分:1)

正如cartant评论的那样:数据是从Firebase异步加载的;当你拨打res.render时,列表仍然是空的。

一种简单的方法是1-2-3测试:

app.get('/zones/:id/experiences', function(req,res) {
  var zone_key = req.params.id;
  var recent = [];
  var ref = firebase.database().ref('participants/'+zone_key+'/experiences');
  console.log("1");
  ref.on("value", function(snapshot) {
    console.log("2");
  });
  console.log("3");
});

运行此代码时,会打印:

  

1

     

3

     

2

您可能希望它打印1,2,3,但由于on("value"异步加载数据,情况并非如此。

解决方案是将需要访问数据的代码移动到回调中,其中数据可用。在您的代码中,您需要原始值和联接的usersnap值,因此需要一些工作。

app.get('/zones/:id/experiences', function(req,res) {
  var zone_key = req.params.id;
  var recent = [];
  var ref = firebase.database().ref('participants/'+zone_key+'/experiences');
  ref.on("value", function(snapshot) {
    var promises = [];
    snapshot.forEach((snap) => {
      promises.push(firebase.database().ref('experiences').child(snap.val()).once("value"));
      Promise.all(promises).then((snapshots) => {
        snapshots.forEach((usersnap) => {
          recent.push(usersnap.val());
        }); 
        res.render('experiences',{key: zone_key, list: recent});  
      });
    });
  });
});

在此代码段中,我们使用Promise.all等待加载所有usersnap