如何删除'message'侦听器上的Redis

hrd*_*rbl 17 publish-subscribe websocket redis node.js

一个典型的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();
  });
});
Run Code Online (Sandbox Code Playgroud)

但是,这里的问题是当client"断开"时,redis1.on('message',FUNC(){})监听器仍然连接.控制台将继续打印出来message.如果要检查事件列表的人redis1,他们仍会发现匿名函数正在侦听.

问题是没有任何redis1.off(...)功能.那么,如何取消绑定/取消订阅/删除/删除redis消息监听器?

注意:不能只执行redis1.end(),因为这会破坏其他websocket连接用户的redis连接.

hrd*_*rbl 25

我在节点REPL中找到的唯一解决方案是不使用该redis.on()函数进行订阅.相反,应该使用redis.addListener()redis.removeListener()函数.此外,不得使用匿名函数作为事件回调.人们可以这样做:

var callback = function(channel, message){

};

redis1.addListener('message', callback);

client.on('disconnect', function(){
  redis1.removeListener('message', callback);    
})
Run Code Online (Sandbox Code Playgroud)

  • 对于像我这样只是浏览过这个并忽略了这一点的人:removeListener实际上正在删除FUNCTION,而不仅仅是清除那个绑定.. IE`removeListener('message',callback)`正在从'消息中删除'回调'函数' 捆绑.意思是如果你使用匿名函数`redis1.addListener('message',function(c,m){..}`,那么你无法删除监听器,redis将继续发布到死套接字 (13认同)
  • redis客户端是一个[EventEmitter](http://nodejs.org/api/events.html#events_class_events_eventemitter),它有一个`on`方法,它只是`addListener`和`removeListener`的别名,它是它是相反的.所以你可以继续使用`on`,同时仍然使用`removeListener`. (5认同)