简体   繁体   中英

How do I differentiate between a connection closing and a refresh in Meteor?

I am trying to determine when a user closes their connection. The problem is that, when I try to use this._session.socket.on("close",...) it also registers when the user refreshes.

Here is my code:

Meteor.publish("friends", function () {
  var id = this._session.userId;
  this._session.socket.on("close", Meteor.bindEnvironment(function()
  { 
    // This logs when the user disconnects OR refreshes
    console.log(id);
  }, function(e){console.log(e)}))
    return Meteor.users.find({...});
});

How do I differentiate between a refresh and a real disconnection?

EDIT: I would really like to avoid using a 'keep alive' function if possible.

Ok, this is a little bit hacky but I'm not sure if there is a better solution. This requires the mizzao:user-status package. The way I solved this problem is to call a meteor method inside the "on close" function that starts polling the database at 5 second intervals and checks if the user's status is online. After a set amount of time (I said 65 seconds), if the user has come online I know it was a refresh.

Anyway, the above is a little bit confusing, so here is the code:

//server
Meteor.publish("some_collection", function(){
  var id = this._session.userId;
  this._session.socket.on("close", Meteor.bindEnvironment(function(){
    Meteor.call("connectionTest", id);
  }, function(e){console.log(e)}));
  return Meteor.users.find({..});
});

//Meteor method
Meteor.methods({
    connectionTest: function(userId){
        this.unblock();
        var i = 0;
        var stop = false;
        var id = Meteor.setInterval(function(){
            var online = Meteor.users.findOne(userId).status.online;
            if(!online){
               console.log("offline");
            }
            else{
                stop = true;
                console.log("still online");
            }
            i++;
            if(stop || i > 12){
                if(online){
                //do something
                }
                else{
                // do something else
                }
                Meteor.clearInterval(id);
            }
        }, 5000);
    }
});

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM