2017-11-04 100 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」打印它,數據將爲空。對此你無能爲力。這就是爲什麼我將需要數據**的代碼移到**回調中。 –