Redis
 sql >> Datenbank >  >> NoSQL >> Redis

Redis, Node.js und Socket.io :Serverübergreifende Authentifizierung und Verständnis von node.js

Ok, ich habe meine Antwort. Ich hatte eine harte Zeit, es herauszufinden, habe stundenlang gesucht ...

Hier ist das verwandte Thema, das es mir ermöglicht hat, es zum Laufen zu bringen (Antwort UND Kommentare):

So entfernen Sie Redis auf „Message“-Listenern

Und hier ist mein Code:

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);
    });
});

Je nach Kontext müssen Sie redis.removeListener beim io.client.disconnect-Ereignis aufrufen.

Hier ist eine wahrscheinliche Alternative:

https://github.com/LearnBoost/Socket.IO/wiki/Configuring-Socket.IO

Übrigens scheint diese verwandte Frage eine ähnliche mit einer genauen Antwort zu sein, ist es aber nicht wirklich (funktionierte nicht). Sehen Sie sich außerdem den hervorgehobenen Kommentar an:

Wie kann man die Redis-Verbindung in socket.io wiederverwenden?