如何删除“消息”侦听器上的Redis

一个典型的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连接。

我通过在节点REPL中find的唯一解决scheme是不使用redis.on()函数来订阅。 相反,应该使用redis.addListener()redis.removeListener()函数。 另外,不能使用匿名函数作为事件callback。 人们可以这样做:

 var callback = function(channel, message){ }; redis1.addListener('message', callback); client.on('disconnect', function(){ redis1.removeListener('message', callback); })