【发布时间】: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