2012-08-06 21 views
7

Quiero fusionar sesiones express.js y socket.io juntas. A continuación se muestra el código (socket.io parte)fusionar las sesiones de socket.io y express.js

var io = require('socket.io').listen(app); 
io.set('log level', 1); 

io.sockets.on('connection', function (socket) { 
    console.log('client connected'); 
client.send(client.id);//send client id to client itself 
socket.on('connect', function(){ 
    console.log(socket.id + ' connected'); 
}); 
socket.on('disconnect', function(){ 
    console.log(socket.id + ' disconnected'); 
}); 
}); 

Mis express.js Configuración de sesión:

app.configure(function() { 
    //app.use(express.logger()); 
    app.use(express.bodyParser()); 
    app.use(express.methodOverride()); 
    app.use(express.static(__dirname + '/static')); 
    app.use(express.cookieParser()); 
    app.use(express.session({store: MemStore({ 
    reapInterval: 60000 * 10 
    }), secret:'foobar', key: 'express.sid' 
})); 

Mi problema principal está en mi terminal cuando el usuario viaja de un URL a otro, el id de sesión también cambia: pero no quiero que se modifique.

info - socket.io started 
client connected 
client connected 
4Z0bYHzfWCEFzbbe4WUK disconnected 
e_uSvxhSLbLAC9-F4WUL disconnected 
client connected 
bKDy90gsrWWTRJDD4WUM disconnected 
client connected 
RJ5qqCL2wfmXbd7U4WUN disconnected 
client connected 
wjN5Sqx4rucRtWL_4WUO disconnected 

Respuesta

6

Está enviando la ID del socket, no la ID de sesión de express.js.

Debe utilizar el evento authorization, su primer parámetro es un objeto que tiene una entrada llamada sessionID. Ese valor no debe cambiar entre recargas de página, ya que se almacena en una cookie (o base de datos redis o lo que sea).

Aquí hay un buen artículo que explica cómo funciona: http://www.danielbaulig.de/socket-ioexpress/, pero está un poco desactualizado. El principio básico permanece igual, pero algunos detalles han cambiado. Por ejemplo, la forma en que crea el servidor ya no funciona, y los desarrolladores de conexión han eliminado parseCookie(). Los usuarios son not happy con esa decisión, sin embargo, la solución es tan fácil de recordar línea de código:

connect.utils.parseSignedCookies(cookie.parse(decodeURIComponent(data.headers.cookie)), secret); 

Como ya he dicho, el artículo mencionado anteriormente debe darle todos los elementos básicos que necesita, si desea ver una implementación funcional, echar un vistazo a esto: https://github.com/vortec/lolbr/blob/master/lib/lolbr.js

Dentro del controlador authorization caso, puede modificar el objeto data y acceder a ella más tarde usando socket.handshake, en su caso: socket.handshake.sessionID.

Espero que ayude.

+0

connect no estaba definido en su ejemplo. Alguna idea para resolver? – Yagiz

+0

@Alex si clona '' lolbr'', asegúrese de tener '' express'' instalado debajo. Simplemente clone, luego '' cd'' en él y escriba '' npm install''. Eso debería funcionar. – Fabian

+0

Por lo tanto, parseSignedCookies no están disponibles en este momento. ¿Cómo sugieres volver a escribir el código? No estoy familiarizado con las cookies en socket.io, pero he encontrado "var cookies = cookie.parse ('foo = bar; cat = miau; dog = ruff');" ejemplo. ¿Cómo debería implementarlo en este ejemplo? – Yagiz