【问题标题】:How to handle multiple tabs using in firebase using realtime database如何使用实时数据库在firebase中处理多个选项卡
【发布时间】:2020-01-18 08:42:08
【问题描述】:

我正在创建一个多人游戏网站。我正在使用 firebase 的三个功能。

  • Firebase 身份验证
  • Firestore
  • 实时数据库

永久数据存储在 Firestore 中。比如头像、用户名等。firestore 中的数据存储在集合users 中,密钥与我们从user.uid 获得的身份验证ID 相同

第二个数据是临时数据,包含聊天消息和当前游戏情况和玩家回合等。这些数据存储在实时数据库中。

实时数据库中有两个基础对象。一个是rooms,另一个是users。当用户登录网站时,永久数据会从 Firestore 中获取并与临时数据一起放置(因为我们可能需要一次又一次地显示永久数据)。我用来获取永久数据并与临时数据创建组合的函数是

//'uid' 是永久的id,用于firestore 和身份验证。

export const addUser = async (uid: string) => {
   //gets the permanent data from firestore
   const data = await getUserData(uid);

   //Set it to realtime database my adding one more temp prop
   return await dbUsers.child(uid).set({...data, messages: []});
};

到目前为止,当我必须在断开连接时删除用户时,问题就来了。我用过

export const removeUser = async (uid: string) => {
   return await dbUsers.child(uid).remove();
};

上述方式不适用于多个标签。考虑如果用户打开了多个选项卡并且他只是关闭了一个服务器,那么实时数据库将认为它已注销。

我是否需要使用push() 方法在另一个id 的基础上创建实时数据。请指导我正确的路径。

【问题讨论】:

    标签: javascript firebase firebase-realtime-database


    【解决方案1】:

    如果我理解正确,您正在尝试使用 Firebase 的 onDisconnect 处理程序跟踪用户的在线状态。为此:

    1. 您在用户连接时为用户的UID 写入一个值。
    2. 然后使用onDisconnect 处理程序删除该值。

    当用户在多个位置(标签、浏览器或设备)打开应用程序时,这确实不起作用。原因是一个用户可以在多个位置在线,你的代码和数据结构需要满足这一点。

    惯用方法是 Firebase 文档中的 sample presence app 中概述的方法,并使用如下数据结构:

    "OnlineUsers": {
      "uidOfUser1": {
        "-LKeyOfConnection1": true,
        "-LKeyOfConnection2": true
      },
      "uidOfUser2": {
        "-LKeyOfConnection3": true,
        "-LKeyOfConnection4": true
      }
    }
    

    在此结构中,如果用户有两个打开的连接(在不同的选项卡、浏览器、设备上),则他们的 UID 下有两个节点,每个节点都有自己的 onDisconnect 处理程序。当两个连接都关闭时,连接键会消失,因此它们的/OnlineUsers/$uid 节点也会自动消失。

    因此,要在上述结构中检测用户是否在线,您需要检查/OnlineUsers 下是否存在具有其UID 的节点。

    【讨论】:

    • 非常感谢。这正是我所需要的。还有一个问题。当用户断开连接时,有什么方法可以调用某些函数。
    • 如果你想在你的应用程序与服务器断开连接时执行一些代码,你可以监听.info/connected并在它变为false时执行该代码。但请注意,当应用程序崩溃或用户强行关闭它时,这不太可能在完全断开连接时运行。
    猜你喜欢
    • 1970-01-01
    • 2017-04-22
    • 1970-01-01
    • 2022-07-11
    • 1970-01-01
    • 2017-01-12
    • 2019-02-07
    • 1970-01-01
    • 2013-03-21
    相关资源
    最近更新 更多