一个典型的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,他们仍然会发现匿名函数正在侦听。
client
redis1.on('message',FUNC(){})
message
redis1
问题是没有redis1.off(...)功能。因此,如何取消绑定/取消订阅/删除/删除Redis消息侦听器?
redis1.off(...)
注意:一个人不能只做redis1.end(),因为这会中断其他websocket连接的用户的redis连接。
通过在节点REPL中玩耍找到的唯一解决方案是不使用该redis.on()功能进行订阅。相反,应该使用redis.addListener()和redis.removeListener()函数。另外,一定不能将匿名函数用作事件回调。一个人可以做这样的事情:
redis.on()
redis.addListener()
redis.removeListener()
var callback = function(channel, message){ }; redis1.addListener('message', callback); client.on('disconnect', function(){ redis1.removeListener('message', callback); })