【问题标题】:Detaching user data snapshot listeners on web app在 Web 应用程序上分离用户数据快照侦听器
【发布时间】:2022-01-05 02:06:09
【问题描述】:

我有一个快照侦听器,用于侦听我使用 Firestore 存储的用户数据的实时变化。听众在那里是因为我正在开发一个聊天功能,因为我需要实时更新用户拥有的聊天 ID 列表,以防添加新的聊天。问题在于当用户断开连接或失去连接时分离侦听器。关于如何在不使用 Real Time DB 中的 onDisconnect 方法的情况下实现此目的的任何建议,因为我无法使用该方法调用 detachListner() 方法。

例子:

这是我的用户文档

{
    name:"Brad"
    avatar:"https://avatar.com"
    chats: [
        {
            id: 1.,
            member_name:"John",
            avatar:""
        },
        {
            id: 2.,
            member_name:"John",
            avatar:""
        },
     ]
}

我在这个文档上有一个活动的快照监听器,

let unsubscribeListener;

export const getChatSnapshot = (user_id, callback) => {
  unsubscribeChatListener = onSnapshot(
    doc(db, "users", user_id),
    (doc) => {
      callback(doc.data());
    },
    (error) => {
      console.log(error.message);
    }
  );
};

当用户断开或关闭页面时,有没有办法断开监听器。 因为使用 onDisconnect 我只有设置、删除...

有没有办法拥有这样的东西。

onDisconnect(userStatusDatabaseRef)
// call unsubscribeListener when user is disconnected.
// like unsubscribeListener()
      .set(isOfflineForDatabase)
      .then(() => {
        set(userStatusDatabaseRef, isOnlineForDatabase);
      });

【问题讨论】:

  • "寻求调试帮助的问题('为什么这段代码不工作?')必须包括期望的行为、特定问题或错误必要的最短代码 在问题本身。没有明确的问题陈述的问题对其他读者没有用处。请参阅:@ 987654321@"
  • 我更新了问题

标签: reactjs firebase firebase-realtime-database google-cloud-firestore next.js


【解决方案1】:

如果您询问是否可以在用户断开连接后执行对 Firestore 的写入,类似于实时数据库的 onDisconnect 处理程序,很遗憾,答案是否定的。

Firestore 使用与实时数据库不同的协议,该协议不允许检测第一次连接或断开连接。如果您需要 Firebase 中的这些功能,那么实时数据库是您的唯一选择。

请注意,您可以在同一个应用程序中同时使用 Firestore 和实时数据库。事实上,有一个解决方案指南解释了如何 build a presence system on Firestore 在幕后使用实时数据库和云函数。

【讨论】:

  • 我的问题是我可以使用 onDisconnect 函数来分离我的监听器吗?
  • onDisconnect 处理程序在客户端已断开连接后在服务器上运行。此时,服务器无法回调您的客户端代码并告诉它取消订阅。如果要在与实时数据库的连接丢失时检测客户端,可以监听.info/connected 节点:firebase.google.com/docs/database/web/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-30
  • 2021-10-30
  • 1970-01-01
  • 2021-07-12
  • 2014-01-16
相关资源
最近更新 更多