node.js - rooms - Cómo detectar conexiones socket.io múltiples del mismo usuario
socket.io example (2)
He seguido esta guía: http://www.danielbaulig.de/socket-ioexpress/ para vincular express.js a socket.io y funciona de manera brillante.
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 los dirige a una nueva página donde se carga socket.io y en el servidor socket.io puede tomar la sesión que fue establecido desde expreso. 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 modificar 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á la forma en que se ve el momento:
//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 verificar si el cliente que está a punto de ser aceptado tiene una conexión previa, y todavía está abierto (y, por lo tanto, tenemos que desconectar el anterior).
La sesión expresa tiene un "nombre de usuario", por lo que podemos obtener el objeto de la sesión y obtener el nombre de usuario, simplemente no puedo entender cómo ir a través de la lista de todos los clientes de socket.io y echar un vistazo al expreso sesión para cada uno y comprobar si es lo mismo que la autentificación del usuario actualmente.
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 última sesión y desconecte forzar desconexión en la sesión existente, si corresponde, antes de almacenar la nueva sesión.
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:
"Los viejos métodos io.set () y io.get () están obsoletos y solo son compatibles con la compatibilidad con versiones anteriores. Aquí hay una traducción de un ejemplo de autorización de estilo antiguo en middleware". en la sección "Migración desde 0.9"
Si usa una nueva versión de Socket.IO. El código que necesitas 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);
});