【问题标题】:Firebase onDisconnect() firing multiple timesFirebase onDisconnect() 多次触发
【发布时间】:2016-11-04 05:04:19
【问题描述】:

按照 firebase 文档构建具有存在状态的应用程序,是否存在在应用程序仍处于连接状态时触发断开连接的情况?我们会看到 Presence 节点将应用显示为离线,然后在我们没有丢失网络连接的情况下在几秒钟内恢复在线的实例。

我们看到在现场安装的多个嵌入式设备上,presence 设置为 false,然后几乎立即恢复为 true,并且在几秒钟内所有设备上都发生了这种情况。从我们所做的测试和在线文档中我们知道,如果我们在设备上失去互联网连接,大约需要 60 秒,服务器上的超时才会触发 onDisconnect() 方法。

我们已经在 Presence 方法中添加了代码,允许设备在应用程序实际运行时看到 Presence 节点设置为 false,它会将 Presence 重置为 true。有时,当这种情况发生时,我们会收到一次写回 true 的情况,这就是它的结束,其他时候就像服务器和客户端相互争斗,并且节点在 50-200 的过程中多次重置为 true毫秒。每次我们强制存在返回为真时,我们通过推送到设备 GUID 中的另一个节点来监控这一点。这只发生在模块运行时和它最初建立存在之后。

这是我们从设备上运行的各种模块调用的方法,以便我们可以在任何给定时间监控每个模块的状态。

exports.online = function (program, currentProgram) {
 var programPath = process.env.FIREBASE_DEVICES + process.env.GUID + '/status/' + program
  var onlinePath = process.env.FIREBASE_DEVICES + process.env.GUID + '/statusOnlineTimes/' + program
  var programRef = new firebase(programPath);
  var statusRef = new firebase(process.env.FIREBASE_DEVICES + process.env.GUID + '/status/bootup');
  var onlineRef = new firebase(onlinePath)
  amOnline.on('value', function(snapshot) {
    if (snapshot.val()) {
      programRef.onDisconnect().set(false);
      programRef.set(true);
      programRef.on('value', function(snapshot){
        if (snapshot.val() == false){
          programRef.set(true);
          console.log('[NOTICE] Resetting', program, 'module status back to True after Fireabase set to False')
          var objectToPush = {
            program: program,
            time: new Date().toJSON()
          }
          onlineRef.push(objectToPush)
        }
      })
      if (currentProgram != undefined) {
        statusRef.onDisconnect().set('Offline')
        statusRef.set(currentProgram)
      }
    }
  }); 

我们的问题是,Firebase 是否会调用 onDisconnect() 方法,即使它确实没有失去其状态?在添加重置代码之前,我们会看到设备离线,然后在 60 秒内重新在线。重置代码是为了解决我们在现场遇到的另一个问题,如果设备的电源中断并且它没有完全退出,设备可以重新启动并在前一个超时之前使用新的 UID 重置存在实例已被解雇。然后,一旦触发超时,设备将显示为离线,即使它实际上是在线的。

【问题讨论】:

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


    【解决方案1】:

    因此,我们能够通过在 programRef.on(...) 调用之前直接添加 programRef.off() 调用来停止设备重新连接时发生的多次推送。我们确定要发生的是,只要设备从离线状态上线并且 amOnline.on(...) 回调触发它就会创建一个新的侦听器。

    现在我们能够处理从早期程序 PID 触发的 onDisconnect() 并以离线状态覆盖当前活动程序的情况。这似乎解决了我们在现场设备的竞争条件下遇到的问题,该设备能够在未完全退出的实例的 onDisconnect() 触发之前重新启动并重新获得连接。

    我们仍然遇到这样一个问题,即所有设备都关闭,然后几乎同时(彼此间隔 1-3 秒)重新上线。 Firebase 是否有任何时候重置 ./info/connected 节点?因为我们正在监视存在并实际登录和关闭事件,也许我们只是捕捉到大多数人看不到的事件?还是我们做错了什么?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-16
      • 2022-10-01
      • 2018-09-05
      相关资源
      最近更新 更多