Firebase/Node.js,正确使用on.Disconnect()

Mtl*_*Dev 3 node.js firebase

我有一个node.js,监视器是Firebase上的一个队列,用于发送GCM推送通知.工作良好.

它还会更新firebase上的"在线"状态.onDisconnect(),因此可以轻松查看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);
});
Run Code Online (Sandbox Code Playgroud)

最初,侦听器正在运行,-NodeSeverStatus显示在线.

但是"一段时间后"(几个小时),侦听器仍然正常运行,并且正在处理队列,但NodeServerStatus现在显示为Offline.

我可以在侦听器本身内移动在线/离线代码,但这似乎只是一个丑陋的黑客攻击,如果在超时期限内没有新的队列帖子,可能会有相同的问题.

这里的最佳做法是什么?谢谢.

Fra*_*len 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");
  }
});
Run Code Online (Sandbox Code Playgroud)

请参阅https://www.firebase.com/docs/web/guide/offline-capabilities.html