我正在尝试编写一个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;
};
答案 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'
,因为您只对一次获取数据感兴趣。