2016-07-01 3 views
1

firebase 문서 다음에 존재하는 응용 프로그램을 빌드하면 응용 프로그램이 여전히 연결되어있을 때 연결 해제가 실행되는 시나리오가 있습니까? 네트워크 연결이 끊어지지 않을 때 프리젠 스 노드가 응용 프로그램이 오프라인 상태로 표시되고 몇 초 안에 다시 온라인 상태로 표시되는 경우를 볼 수 있습니다.Firebase onDisconnect() 여러 번 실행

현재 상태가 false로 설정되어있는 필드에 설치된 여러 임베디드 장치가 표시되고 거의 즉시 다시 true로 돌아와서 몇 초 내에 모든 장치에서 발생합니다. 우리가 수행 한 테스트와 온라인 문서에서 서버의 인터넷 연결이 끊어지면 약 60 초가 걸리므로 서버의 시간 초과가 onDisconnect() 메소드를 실행합니다.

이후 응용 프로그램이 실제로 실행 중일 때 장치가 존재 노드를 거짓으로 설정하면 장치를 허용하는 코드를 추가하여 현재 상태를 다시 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) 
     } 
    } 
    }); 

우리가 가진 문제는 중포 기지 그것이 정말 그 지위를 상실되지 않은 경우에도 방법 OnDisconnect의()를 호출하는 경우는 적있다? 리셋 코드를 추가하기 전에 기기가 오프라인 상태로 전환 된 후 60 초 이내에 다시 온라인 상태가되는 경우가있었습니다. 리셋 코드는 우리가 현장에서 가지고 있던 또 다른 문제에 대처하는 것이 었습니다. 전원이 장치에 중단되어 깨끗한 종료를하지 못하면 장치가 재부팅되어 이전 UID에 대한 시간 초과 전에 새로운 UID로 현재 상태를 재설정 할 수있었습니다 인스턴스가 해고됐다. 그런 다음 제한 시간이 지나면 실제로 온라인 상태 였지만 기기는 오프라인으로 표시됩니다.

답변

0

그래서 programRef.on (...) 호출 바로 전에 programRef.off() 호출을 추가하여 장치를 다시 연결할 때 발생했던 여러 번의 푸시를 중지 할 수있었습니다. 우리는 언제든지 장치가 오프라인 상태에서 온라인 상태로 전환되고 amOnline.on (...) 콜백이 실행되면 언제든지 새 수신기를 생성한다는 결론을 내 렸습니다.

이제 우리는 onDisconnect()가 이전 프로그램 PID에서 시작하여 현재 활성화 된 프로그램을 오프라인 상태로 덮어 쓰는 경우를 처리 할 수 ​​있습니다. 이것은 우리가 재부팅 할 수있는 장치의 경쟁 상태와 관련된 문제를 해결하는 것으로 보이며, 정상적으로 종료되지 않은 인스턴스에 대해 onDisconnect()가 실행되기 전에 연결을 다시 얻을 수 있습니다.

우리는 여전히 모든 장치가 거의 동시에 (약 1 ~ 3 초 이내에) 온라인 상태가되고 다시 온라인 상태가되는 문제가 있습니다. Firebase가 ./info/connected 노드를 재설정 할 때가 있습니까? 우리가 현재 상태를 모니터링하고 실제로 이벤트를 로그온 및 로그 오프했기 때문에 대부분의 사람들이 보지 못하는 이벤트를 잡을 수 있습니까? 아니면 우리가 잘못하고있는 것이 있습니까?

관련 문제