2017-11-04 96 views
0

火力“推动”对象到一个数组不工作

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嵌套这样的查询好吗?在另一个查询中循环

+0

传递给'on'的回调是异步调用的:https://stackoverflow.com/q/14220321/6680611 – cartant

回答

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,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 s到加载。

+0

在这种情况下,您似乎在尝试使用不存在的数据。我很难确定这一点,因为我从你自己的答案中复制了这部分内容,并且没有可用的数据来验证。你可以尝试在jsbin中重现问题,所以我可以看看? –

+0

是的你是对的,我设法修复那部分。但是,“最近”列表仍然没有填充。我控制台记录了snapshots.forEach((usersnap)=> {...})中发生的情况,并且我可以打印出添加到我的Promises列表中的每个对象,但是在终端中,该代码不会在该块之后控制日志记录的代码。即使在打印完所有内容后,它仍然试图从列表中读取更多数据。 – user3892254

+0

这取决于你的'console.log()'数据。我的第一个片段显示,如果您在位置“3”打印它,数据将为空。对此你无能为力。这就是为什么我将需要数据**的代码移到**回调中。 –