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
答案 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
。