Firebase实时数据库仅在第二个请求中有效

时间:2019-06-14 12:35:33

标签: node.js firebase express firebase-realtime-database

每次我尝试从实时数据库调用数据时,第一次尝试都返回null,但在第二次请求时获得正确的数据
那就是我的代码

module.exports.getAllPosts = async () => {
  await db.dbRef.child("posts").on('value', function (snap) {
    temp = snap.val();
    return;
  });
  return temp;
};

我到处都使用异步功能,但仍然无法正常工作 我正在使用express调用此函数

1 个答案:

答案 0 :(得分:1)

与许多现代的Web API一样,数据是从Firebase异步加载的。这意味着主要代码将继续运行,并且在加载数据之后将调用回调函数。

通过在代码中添加一些日志记录,您可以最好地看到这一点:

console.log("Before attaching listener");
await db.dbRef.child("posts").on('value', function (snap) {
  console.log("Got data");
});
console.log("After attaching listener");

运行此代码时,您将得到:

  

在附加侦听器之前

     

附加监听器后

     

获得数据

这可能不是您期望的顺序。但这完全说明了您的代码为什么不起作用:在您的return temp运行时,尚未加载数据,而temp就是开始加载数据之前的状态。 / p>

解决方案是不尝试立即返回数据,而是返回所谓的数据承诺。由于您的顶级功能已被标记为async,因此这是一个简单的更改:

module.exports.getAllPosts = async () => {
  return await db.dbRef.child("posts").on('value', function (snap) {
    return snap.val();
  });
};