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

时间:2016-02-26 00:47:33

标签: node.js firebase

我有一个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现在显示为脱机。

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

这里的最佳做法是什么?三江源。

1 个答案:

答案 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