【问题标题】:firebase real time database works only in second requestfirebase 实时数据库仅在第二个请求中工作
【发布时间】:2019-06-14 12:35:33
【问题描述】:

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

    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 是您开始加载数据之前的任何内容。

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

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

    【讨论】:

    • 我试过你的答案,但它没有返回数据,它返回一个 Function 但是当我按照你的建议登录时,我发现你得到了 point 。我在加载数据之前返回数据
    猜你喜欢
    • 2019-02-25
    • 2019-05-01
    • 2021-04-10
    • 2021-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多