Вопрос по node.js, websocket, redis, publish-subscribe – Как удалить Redis на слушателях 'message'

15

Типичный пример чата 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 (), поскольку это нарушит соединение redis для других пользователей, подключенных к веб-сокетам.

Ваш Ответ

1   ответ
23

Единственное решение, которое я нашел, играя в узле REPL, это не использоватьredis.on() функция подписки. Вместо этого следует использоватьredis.addListener() а такжеredis.removeListener() функции. Кроме того, нельзя использовать анонимные функции в качестве обратных вызовов событий. Можно сделать что-то вроде этого:

var callback = function(channel, message){

};

redis1.addListener('message', callback);

client.on('disconnect', function(){
  redis1.removeListener('message', callback);    
})
Для любого, как я, который просто просмотрел это и упустил момент: removeListener фактически удаляет FUNCTION, а не просто очищает эту привязку .. I.E.removeListener('message', callback) удаляет «обратный вызов»; функция из «сообщения» связывание. Значение, если вы используете анонимную функциюredis1.addListener('message', function(c,m){ .. }, тогда у вас нет возможности удалить слушателя и Redis будет продолжать публиковать в мертвые сокеты
Клиент Redis являетсяEventEmitter, который имеетon метод, который является просто псевдонимом дляaddListener, а такжеremoveListenerчто является противоположностью. Таким образом, вы можете продолжать использоватьon, пока еще используюremoveListener.
@Thechoyce Ваш комментарий дает мне больше информации, чем ответ!

Похожие вопросы