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});
});
在上面的代码中,我正在查询引用点以获取一组“键”。然后,对于每个键,我查询另一个引用点以获取与该键关联的对象。然后,对于为这些键返回的每个对象,我只想将这些对象插入列表中。然后,我想将此列表传递到客户端站点,以使用渲染来处理数据。
出于某种原因,最近的 []
永远不会被填充。它仍然是空的。这是我的变量不在范围内的问题吗?我通过控制台记录来检查引用点返回的数据,一切都很好,我得到了我想要的数据。
P.S 这样的嵌套查询可以吗? For 另一个查询中的循环
最佳答案
正如 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
加载。
关于javascript - FRebase "pushing"数组对象不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47107156/