20

サーバーがクリーンアップを試行できるように、更新するかページから移動することによって、クライアントが流星サーバーから切断されたことを検出する方法はありますか?

4

5 に答える 5

19

1 つの手法は、各クライアントが定期的に呼び出す「キープアライブ」メソッドを実装することです。これはuser_id、各クライアントのに保留があることを前提としていますSession

// server code: heartbeat method
Meteor.methods({
  keepalive: function (user_id) {
    if (!Connections.findOne(user_id))
      Connections.insert({user_id: user_id});

    Connections.update(user_id, {$set: {last_seen: (new Date()).getTime()}});
  }
});

// server code: clean up dead clients after 60 seconds
Meteor.setInterval(function () {
  var now = (new Date()).getTime();
  Connections.find({last_seen: {$lt: (now - 60 * 1000)}}).forEach(function (user) {
    // do something here for each idle user
  });
});

// client code: ping heartbeat every 5 seconds
Meteor.setInterval(function () {
  Meteor.call('keepalive', Session.get('user_id'));
}, 5000);
于 2012-04-23T02:40:55.417 に答える
13

パブリッシュ関数でソケットクローズイベントをキャッチする方が良いと思います。

Meteor.publish("your_collection", function() {
    this.session.socket.on("close", function() { /*do your thing*/});
}

アップデート:

meteor の新しいバージョンは、次のように _session を使用します。

this._session.socket.on("close", function() { /*do your thing*/});
于 2012-09-20T03:13:16.933 に答える
2

さまざまなセッションから接続されたすべてのセッションを追跡し、高価なキープアライブなしでセッションのログアウトと切断イベントの両方を検出する Meteor スマート パッケージを実装しました。

https://github.com/mizzao/meteor-user-status

切断/ログアウト イベントを検出するには、次のようにします。

UserStatus.on "connectionLogout", (info) ->
  console.log(info.userId + " with session " + info.connectionId + " logged out")

また、反応的に使用することもできます。見てみな!

EDIT: v0.3.0 of user-status は、アイドル状態のユーザーも追跡するようになりました!

于 2013-07-12T21:09:14.733 に答える
1

Auth を使用している場合は、メソッドおよびパブリッシュ関数でユーザーの ID にアクセスできます。そこで追跡を実装できます。たとえば、ユーザーが部屋を切り替えたときに「最後に見た」を設定できます。

Meteor.publish("messages", function(roomId) {
    // assuming ActiveConnections is where you're tracking user connection activity
    ActiveConnections.update({ userId: this.userId() }, {
        $set:{ lastSeen: new Date().getTime() }
    });
    return Messages.find({ roomId: roomId});
});
于 2012-09-12T09:17:00.793 に答える