【问题标题】:How to remove Redis on 'message' listeners如何在“消息”侦听器上删除 Redis
【发布时间】:2012-07-22 00:00:44
【问题描述】:

一个典型的 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。如果要检查redis1 的事件侦听器,他们仍然会发现匿名函数正在侦听。

问题是没有redis1.off(...) 函数。那么,如何解绑/取消订阅/删除/移除redis消息监听器呢?

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

【问题讨论】:

    标签: node.js websocket redis publish-subscribe


    【解决方案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);    
    })
    

    【讨论】:

    • redis 客户端是一个EventEmitter,它有一个on 方法,它只是addListenerremoveListener 的别名,正好相反。所以你可以继续使用on,同时仍然使用removeListener
    • 对于像我这样只是略过这一点并没有抓住重点的人:removeListener 实际上是在删除 FUNCTION,而不仅仅是清除绑定.. I.E. removeListener('message', callback) 正在从“消息”绑定中删除“回调”函数。这意味着如果您使用匿名函数redis1.addListener('message', function(c,m){ .. },那么您将无法删除侦听器,redis 将继续发布到死套接字
    • @Thechoyce 你的评论给了我比答案更多的信息!
    猜你喜欢
    • 1970-01-01
    • 2013-10-15
    • 2011-09-05
    • 1970-01-01
    • 1970-01-01
    • 2010-12-04
    • 2016-03-13
    • 2019-01-08
    • 2021-10-07
    相关资源
    最近更新 更多