Добре, имам своя отговор. Трудно ми беше да го разбера, търсех с часове ...
Ето свързаната тема, която ми позволи да я накарам да работи (отговор И коментари):
Как да премахнете Redis от слушателите на „съобщения“
А ето и моя код:
io.on('connection', function(client){
console.log('Client id #'+client.id);
if (client.handshake.session) {
var user_socket_channel = client.handshake.session['user_socket_channel'];
}
var redis_listener = function(redis_channel, rawdata) {
console.log('Redis connection on '+redis_channel);
var data = JSON.parse(rawdata);
if (data.channel) { var socket_channel = data.channel; }
else {
if (user_socket_channel) { var socket_channel = user_socket_channel; }
else { var socket_channel = 'public' }
}
var rails_data = data.data;
console.log('Socket.io emiting on ['+socket_channel+']');
client.emit(socket_channel, rails_data);
};
redis_subs.on('message', redis_listener);
client.on('disconnect', function(){
console.log('Client disconnect, removing redis listener..');
redis_subs.removeListener('message', redis_listener);
});
});
В зависимост от контекста, трябва да извикате redis.removeListener на събитие io.client.disconnect.
Ето една вероятна алтернатива:
https://github.com/LearnBoost/Socket.IO/wiki/Configuring-Socket.IO
Между другото, този свързан въпрос изглежда подобен с точен отговор, но всъщност не е (не работи). Още повече, вижте маркирания коментар:
Как да използвам повторно Redis връзка в socket.io?