Как удалить Redis на слушателях 'message'
Типичный пример чата 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 ответ
Единственное решение, которое я нашел, играя в узле REPL, это не использовать redis.on()
функция подписки. Вместо этого следует использовать redis.addListener()
а также redis.removeListener()
функции. Кроме того, нельзя использовать анонимные функции в качестве обратных вызовов событий. Можно сделать что-то вроде этого:
var callback = function(channel, message){
};
redis1.addListener('message', callback);
client.on('disconnect', function(){
redis1.removeListener('message', callback);
})