如何删除对Redis的“消息”监听器(How to remove Redis on 'mes

2019-06-26 11:48发布

一个典型的Redis的聊天例子会是这样的(见https://github.com/emrahayanoglu/Socket.io-Redis-RealTime-Chat-Example/blob/master/chatServer.js只是这样一个例子):

io.sockets.on('connection', function (client) { //websocket connection

  redis1.subscribe("chat");

  redis1.on("message", function(channel, message) {
      console.log(message);
      client.send(message);
  });

  client.on('message', function(msg) {
    redis2.publish("chat",msg.message);  
  });

  client.on('disconnect', function() {
      redis1.quit();
  });
});

然而,这里的问题是,当一个client “断开”,该redis1.on('message',FUNC(){})监听器仍然连接。 控制台将继续打印出message 。 如果一个人检查的情况下listners redis1 ,他们仍然会发现匿名函数监听。

问题是,有没有redis1.off(...)函数。 那么,如何解除绑定一个/取消/删除/移除Redis的消息监听器?

注:我们不能只是做redis1.end(),因为这将打破其他的WebSocket连接的用户Redis的连接。

Answer 1:

我已经通过在节点REPL玩弄发现的唯一的解决方案是不使用redis.on()函数进行订阅。 相反,人们应该使用redis.addListener()redis.removeListener()函数。 另外,一个不能使用匿名函数作为事件回调。 人们可以做这样的事情:

var callback = function(channel, message){

};

redis1.addListener('message', callback);

client.on('disconnect', function(){
  redis1.removeListener('message', callback);    
})


文章来源: How to remove Redis on 'message' listeners