socketio覆盖onclose方法

时间:2015-05-19 14:18:08

标签: node.js sockets

当用户断开连接时,

需要向他所有的房间广播。所以我需要在服务器端disconnect事件中获得socket.rooms。 但文档说这是不可能的,因为当断开触发器时,套接字已离开所有房间。

我深入了解源代码并找到了这段代码:

Socket.prototype.onclose = function(reason){
  if (!this.connected) return this;
  debug('closing socket - reason %s', reason);
  this.leaveAll();
  this.nsp.remove(this);
  this.client.remove(this);
  this.connected = false;
  this.disconnected = true;
  delete this.nsp.connected[this.id];
  this.emit('disconnect', reason);
};

也许我应该覆盖这个方法并插入一个断开连接的事件,如下所示:

io.on("connection", function(socket){

    var onclose = socket.onclose;
    socket.onclose = function(reason){
        this.emit('disconnecting', reason);
        onclose.apply(socket, reason);
    };

    //other logic ...
}

但这段代码不起作用。 需要一些建议或其他解决方案。 TKS。

P.S:

节点版本:v0.12.3

socket.io版本:“1.3.2”

1 个答案:

答案 0 :(得分:0)

不是一种聪明的方式,但最终还是有效的。

io.on("connection", function(socket){

    var onclose = socket.onclose;
    socket.onclose = function(reason){
        this.__disconnecting(reason);
        onclose.call(socket, reason);
    };

    socket.__disconnecting = function(reason){
        console.log(socket.rooms);
    };

    // other logic ...
}