Firebase on('child_added'正在添加更多不需要的子/ .once只返回数组中的最后一个

时间:2017-08-16 11:24:24

标签: json node.js firebase firebase-realtime-database promise

使用节点脚本在给出json文件中列出的网站时自动调用Google的pagespeed api。

{
  "1" : "https://bitbucket.org",
  "2" : "https://www.catswhocode.com/blog/"
}

目的是将api调用的结果添加到firebase json数据库以及顶级 url 节点,以存储输入的sitestats的firebase密钥。这是我需要的示例firebase数据结构。

sites
 -KrehhWxld7XlKCuFSHRY
   stats { ... }
   url: "https://bitbucket.org"
 -KrehhXAWlYdjAOA9sd95
   stats { ... }
   url: "https://stackoverflow.com"
urls :
 393957be871e209a76e0dc5df1f526ec : -KrehhWxld7XlKCuFSHRY
 7f4c919540be6ec81cd37d9e61da6c37 : -KrehhXAWlYdjAOA9sd95

在一个承诺中,我正在为firebase json数据库中的节点添加引用。

Promise.all(allRes).then( function( values ) {
var ref = db.ref();
var sitesRef = ref.child("sites");
var urlsRef = ref.child("urls");
var psiresults = {};
  SitesArray.map(function (sites, index) {
    psiresults[sites] = values[index]
    desktopStats = values[index].desktopStats;
    mobileStats = values[index].mobileStats;
    sitesRef.push({
      url: sites,
      stats: metricsResponse
    });
    sitesRef.once('child_added', function(snapshot) {
      console.log(snapshot.key) //returns the last key only
    });
  });

使用once('child_added', ...时,它仅为最后一项添加到网址顶级节点。但是,如果on('child_added', ...添加了相同数据和其他子项的多个副本。每次将子项添加到站点节点时,不确定如何将确切的子键添加到 urls 顶级节点。

2 个答案:

答案 0 :(得分:1)

如果您要处理所有网址一次,请将once('value'snapshot.forEach()

一起使用
sitesRef.once('value', function(snapshot) {
  snapshot.forEach(function(child) {
    console.log(child.key);
  });
});

答案 1 :(得分:0)

最后,我必须使用..

sitesRef.on('value', function(snapshot) {
  ... 
});

这将返回所有子项,然后我可以根据SitesArray值过滤结果。我并不是真的觉得这是一个合适的解决方案,但是,我能够让它发挥作用。