典型的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连接。
答案 0 :(得分:24)
我在节点REPL中找到的唯一解决方案是不使用redis.on()
函数进行订阅。相反,应该使用redis.addListener()
和redis.removeListener()
函数。此外,不得使用匿名函数作为事件回调。
人们可以这样做:
var callback = function(channel, message){
};
redis1.addListener('message', callback);
client.on('disconnect', function(){
redis1.removeListener('message', callback);
})