我有一个node.js,监视器是Firebase上的一个队列,用于发送GCM推送通知。工作正常。
它还通过.onDisconnect()
更新firebase上的“在线”状态,因此可以轻松查看Node.js服务器是否在线并正在运行。
问题:一段时间后,即使听众仍然连接并且运行正常,它也会显示“已断开连接”。
const NODESERVERONLINE="NodeSeverStatus";
var ref = new Firebase(FBURL+FBKEY_GCM_QUEUE);
ref.child("NODESERVERONLINE").set("Online");
ref.child("NODESERVERONLINE").onDisconnect().set("Offline!");
ref.on("child_added",function(snapshot, prevChild){
If (snapshot.key()!=NODESERVERONLINE) DO_GCM_PUSH(snapshot.val());
}, function(errorObject){
console.log("Error reading Firebase: " + errorObject.code);
});
最初,侦听器正在运行,-NodeSeverStatus显示在线。
但是“经过一段时间”(几个小时)后,侦听器仍然正常运行,并且正在处理队列,但NodeServerStatus现在显示为脱机。
我可以在侦听器本身内移动在线/离线代码,但这似乎只是一个丑陋的黑客攻击,如果在超时期限内没有新的队列帖子,可能会出现同样的问题。
这里的最佳做法是什么?三江源。
答案 0 :(得分:5)
快速猜测是您的网络连接短暂中断。
如果您使用网络连接襟翼,服务器将检测断开连接并设置Offline!
。
客户端将自动重新连接,但您再也不会设置Online
。
因此,您希望收听.info/connected
并在那里设置Online
。
var ref = new Firebase("https://yours.firebaseio.com");
ref.child("NODESERVERONLINE").onDisconnect().set("Offline!");
ref.child(".info/connected").on("value", function(snapshot) {
if (snapshot.val() === true) {
ref.child("NODESERVERONLINE").set("Online");
}
});
请参阅https://www.firebase.com/docs/web/guide/offline-capabilities.html