Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js Firebase onDisconnect()多次点火_Node.js_Firebase_Firebase Realtime Database - Fatal编程技术网

Node.js Firebase onDisconnect()多次点火

Node.js Firebase onDisconnect()多次点火,node.js,firebase,firebase-realtime-database,Node.js,Firebase,Firebase Realtime Database,在firebase文档之后构建具有状态的应用程序,是否存在当应用程序仍处于连接状态时启动断开连接的场景?我们看到,当我们没有失去网络连接时,状态节点显示应用程序离线,然后在几秒钟内恢复在线 我们在现场安装的多个嵌入式设备上看到,状态设置为false,然后几乎立即返回true,并且在所有设备上都会在几秒钟内发生。通过我们所做的测试和在线文档,我们知道如果我们在设备上失去internet连接,服务器超时触发onDisconnect()方法大约需要60秒 此后,我们在presence方法中添加了代码,

在firebase文档之后构建具有状态的应用程序,是否存在当应用程序仍处于连接状态时启动断开连接的场景?我们看到,当我们没有失去网络连接时,状态节点显示应用程序离线,然后在几秒钟内恢复在线

我们在现场安装的多个嵌入式设备上看到,状态设置为false,然后几乎立即返回true,并且在所有设备上都会在几秒钟内发生。通过我们所做的测试和在线文档,我们知道如果我们在设备上失去internet连接,服务器超时触发onDisconnect()方法大约需要60秒

此后,我们在presence方法中添加了代码,允许设备在应用程序实际运行时,如果看到presence节点设置为false,则会将presence重置为true。当这种情况发生时,我们会得到一个回写为true的消息,这就是它的结束,其他时候就像服务器和客户机在相互争斗,节点在50-200毫秒的过程中多次重置为true。我们通过在每次强制状态恢复为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重置存在。然后,一旦触发超时,设备将显示为脱机,即使它实际上处于联机状态。

因此,我们能够通过在programRef.on(…)调用之前直接添加programRef.off()调用来停止设备重新连接时发生的多次推送。我们确定要发生的是,无论何时设备从脱机状态进入联机状态,amOnline.on(…)回调都会触发,从而创建一个新的侦听器

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

我们仍然存在一个问题,即所有设备都将关闭,然后在大约相同的时间(在彼此之间的1-3秒内)重新联机。Firebase是否在任何时候重置./info/connected节点?因为我们在监控状态并实际登录和注销事件,所以我们可能只是在捕捉一个大多数人看不到的事件?还是我们做错了什么