2012-05-07 14 views
10

He seguido esta guía: http://www.danielbaulig.de/socket-ioexpress/ para vincular express.js a socket.io y funciona de manera brillante.Cómo detectar conexiones socket.io múltiples del mismo usuario

Tengo el usuario que inicia sesión en una página (solicitud POST express.js que establece un objeto de sesión) y cuando se han autenticado lo dirige a una nueva página donde se carga socket.io y en el servidor socket.io agarra la sesión que se estableció desde express. Para que todo funcione bien

Ahora tengo usuarios en la página que usa socket.io y cuando esa página se actualiza: a veces la conexión de socket.io todavía está allí (es decir, no se desconecta). Lo que intento hacer es alterar la función io.set('authorization') para garantizar que cuando el usuario se conecte, desconectará todas las instancias socket.io existentes que aún estén abiertas para ese cliente.

Aquí está el cómo se ve en la actualidad

//socket.io connect to express 
var parseCookie = require('connect').utils.parseCookie; 
io.set('authorization', function (data, accept) { 
    if (data.headers.cookie) 
    { 
     data.cookie = parseCookie(data.headers.cookie); 
     data.sessionID = data.cookie['express.sid']; 
     // (literally) get the session data from the session store 
     sessionStore.get(data.sessionID, function (err, session) 
     { 
      if (err || !session) 
      { 
       // if we cannot grab a session, turn down the connection 
       //note: a session is created when the user logs in 
       accept('Error', false); 
      } 
      else 
      { 
       //TODO something here before we accept the connection 
       //?? 

       // save the session data 
       data.session = session; 
       //accept the connection 
       accept(null, true); 
      } 
     }); 
    } 
    else 
    { 
     return accept('No cookie transmitted.', false); 
    } 
}); 

¿Cómo puedo comprobar si el cliente que está a punto de ser aceptada tiene una conexión anterior, y todavía está abierta (y por lo tanto tenemos que desconecta el viejo).

La sesión exprés tiene un "nombre de usuario" en ella, así que podemos obtener el objeto de sesión y obtener el nombre de usuario, simplemente no puedo entender cómo revisar la lista de todos los clientes de socket.io y tener un Mire la sesión express para cada uno y verifique si es igual que la autentificación del usuario actualmente.

Respuesta

6

En mi aplicación, administro explícitamente las sesiones de socket.io. En el lado del servidor, cada vez que se establece una nueva conexión, hago algo como: socketio_session[user_id].push(session). Esto me da acceso a todas las sesiones conectadas para un usuario en particular. En su caso, es posible que no necesite almacenar una lista de sesiones por usuario, sino que solo almacene la sesión más reciente y onconnect forzar desconexión en la sesión existente, si corresponde, antes de almacenar la nueva sesión.

+0

Sí, esto está mirando ser la opción más fácil. Aunque estoy seguro de que debe haber una manera de hacerlo con la variable global socket.io. – Andrew

+0

Utilizo TornadIO2, en cuyo caso no existe un camino integrado para tal cosa (leo el código fuente línea por línea buscando uno). Pero si utilizo Node.js con socket.io en el servidor, entonces no estoy tan seguro. –

+0

Sí, parece que esta era la forma más fácil de hacer las cosas. Ahora estoy almacenando todas las conexiones en una matriz, así que tengo acceso a ellas ... Saludos por eso. – Andrew

0

Hay un montón de código en Socket.IO ha sido antiguo.

La nueva documentación (Socket.IO 1.3.6, en este momento), dice:

"El io.set de edad() y io.get() métodos están en desuso y sólo se admiten para la compatibilidad hacia atrás aquí. es una traducción de un ejemplo de autorización de estilo antiguo en middleware ". en la sección "Migración desde 0.9"

Si utiliza una nueva versión de Socket.IO. El código que necesita es algo así como:

var sessionStore = new MongoStore({ url: config.db }); 
    var cookie   = require('cookie-parser')("SECRET"); 
    io.use(function(socket, callback) { 
     if (socket.request.headers.cookie) { 
      cookie(socket.request, null, function(err) { 
       sessionStore.get(socket.request.signedCookies["connect.sid"], function(err, session) { 
        if (err || !session) { 
         callback('Session error', false); 
        } else { 
         socket.request.sessionID = socket.request.signedCookies["connect.sid"]; 
         console.log(socket.request.sessionID); 
         callback(null, true); 
        } 
        }); 
      }); 
     } 
     else { 
      return callback('No session.', false); 
     } 
    }); 
    io.on('connection', function(socket) { 
     console.log(socket.request.sessionID); 
    }); 
Cuestiones relacionadas