用函数导出整个firebase实时数据库

时间:2018-01-15 23:11:11

标签: javascript firebase firebase-realtime-database google-cloud-functions

我正在尝试编写一个firebase函数,它返回整个firebase数据库的json转储(甚至只返回/ Reports节点)。为什么以下只返回空白?

app.get('/export', (req, res) => {

   var db = admin.database();
   var fullDataDump;

 db.ref('Reports').on('value', function(snapshot) {
    fullDataDump = snapshotToArray(snapshot);
});

return res.status(200).json(fullDataDump);

});

function snapshotToArray(snapshot) {
      var returnArr = [];

      snapshot.forEach(function(childSnapshot) {
          var item = childSnapshot.val();
          item.key = childSnapshot.key;

          returnArr.push(item);
      });

      return returnArr;
    };

1 个答案:

答案 0 :(得分:2)

数据是从Firebase(以及几乎所有现代Web API)异步加载的。当您发送回复时,数据尚未退出Firebase。

这就是为什么在注册监听器时必须指定回调到Firebase的原因:Firebase可以在加载数据后调用您的代码。

解决方案是将将响应发送到客户端的代码移动到回调中:

app.get('/export', (req, res) => {

   var db = admin.database();
   var fullDataDump;

 db.ref('Reports').once('value', function(snapshot) {
    fullDataDump = snapshotToArray(snapshot);
    res.status(200).json(fullDataDump);
});


});

function snapshotToArray(snapshot) {
  var returnArr = [];

  snapshot.forEach(function(childSnapshot) {
      var item = childSnapshot.val();
      item.key = childSnapshot.key;

      returnArr.push(item);
  });

  return returnArr;
};

您会注意到我也将on('value'更改为once('value',因为您只对一次获取数据感兴趣。