【问题标题】:Firebase listener keeps working after logging out注销后 Firebase 侦听器继续工作
【发布时间】:2021-05-24 18:52:03
【问题描述】:

我目前在我的应用程序的一个特定屏幕中将一个侦听器附加到一个文档,它看起来像这样:

const statusHandler = () => {//logging if user is online.
        var ref = firebase.database().ref(`users/${PersonalId}/onlineState`)
        ref.on('value', function(snapshot){
            ref.onDisconnect().set(false);
            ref.set(true);
        })
    };

如果用户关闭应用或失去与互联网的连接,firebase 会将其 onlineState 设置为 false。

问题是,在我在另一个屏幕上使用以下功能注销后:

firebase.auth().signOut().then(() => {
    // Sign-out successful.
  }).catch((error) => {
    console.log(error)
  });

听者不停。 firebase 中应该更改为 false 的对象保持为 true,只有当我关闭应用程序并终止它时,它才会变为 false,因此我假设即使在我注销后 on() 侦听器也会继续运行。 我发现这真的很令人困惑,因为即使我注销了当前用户,因此理论上应该取消与 firebase 的连接,但数据库并没有真正“断开”并继续运行。

这不是我只有一个听众的问题,而是多个听众的问题。我试图找到一个关于如何一次取消订阅应用程序内所有听众的想法。

知道如何解决这个问题吗?

【问题讨论】:

  • 除了 Shai 的回答,还要注意单个用户(甚至单个设备)可以有多个连接。试图填充所有这些信息会导致问题,这就是为什么 Firebase 文档中的解决方案为每个连接使用单独的子节点(请注意其中的 var con = myConnectionsRef.push();)。见firebase.google.com/docs/database/web/…

标签: javascript firebase react-native firebase-realtime-database firebase-authentication


【解决方案1】:

因此理论上应该取消与火力基地的连接

你为什么这么认为? 请注意,与此 ref 的连接仍处于活动状态,您只是将用户注销。

docs 声明:

OnDisconnect 类用于管理当此客户端断开连接时将在服务器上运行的操作。

这就是为什么当您终止应用程序时它会断开连接而不是之前。

用户注销成功后可以拨打Firebase.goOffline()强制客户端断开连接。

【讨论】:

  • goOffline() 在这种情况下将不起作用,因为侦听器会继续进入应用程序内部。一旦我再次执行 goOnline(),问题就会再次出现,并且 firebase 会注意到应该终止的错误正在进行的侦听器。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-05
  • 2012-02-28
  • 1970-01-01
  • 1970-01-01
  • 2019-05-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多