断开连接后socket.io连接仍然存在

时间:2017-09-11 13:05:13

标签: node.js express socket.io

我正在尝试使用nodejs EventEmitter将消息从Redis pubsub转发到socketio客户端。

  var events = require('events');
  var subscriber = redis.createClient();

  var app = express();

  var localEmitter = new events.EventEmitter();


  var server = require('http').createServer(app);

  var io = require("socket.io")(server, {secure: 'true'});

  io.on('connection', function (socket) {
    localEmitter.on('FORWARDING', function(message)) {
      console.log(socket.id + ': localEmitter is forwarding messages');
    }

    socket.on('disconnect', function(){
      console.log(socket.id + ' disconnected);
    })
  };


  subscriber.on('message', function (channel, message) {

      console.log("Got message from redis");
      localEmitter.emit('FORWARDING', encoded);
  });

但是如果我刷新网页,websocket连接断开连接并重新连接,可以触发disconnect方法,但localEmitter仍然通过旧套接字ID转发消息。

日志看起来像:

pxw8pcocxI3O2ru3AAAA: localEmitter is forwarding message
0BX2bVYoAn2g2JtMAAAB: localEmitter is forwarding message
0BX2bVYoAn2g2JtMAAAB disconnected
pxw8pcocxI3O2ru3AAAA: localEmitter is forwarding message
0BX2bVYoAn2g2JtMAAAB: localEmitter is forwarding message
...

1 个答案:

答案 0 :(得分:0)

套接字断开连接时删除事件发射器

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

  localEmitter.on('FORWARDING', mymessage);

  function mymessage(message) {
    console.log(socket.id + ': localEmitter is forwarding messages');
  }

  socket.on('disconnect', function() {
    localEmitter.removeListener('FORWARDING', mymessage);
    console.log(socket.id + ' disconnected');
  });

});

您也可以使用相同的房间概念。