2012-08-06 10 views
7

Voglio unire insieme express.js e socket.io. Qui di seguito è il mio codice (socket.io parte)unione sessioni socket.io ed 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'); 
}); 
}); 

miei express.js Impostazioni di Sessione:

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

Il mio problema principale è nel mio terminale quando l'utente si sposta da un URL a un altro, l'id di sessione cambia anche: Ma io non voglio che sia cambiato.

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 

risposta

6

Si sta emettendo l'ID socket, non l'ID sessione da express.js.

È necessario utilizzare l'evento authorization, il suo primo parametro è un oggetto che ha una voce denominata sessionID. Quel valore non dovrebbe cambiare tra ricariche di pagina, poiché è memorizzato in un cookie (o database redis o qualsiasi altra cosa).

Ecco un buon articolo che spiega come funziona: http://www.danielbaulig.de/socket-ioexpress/, ma è un po 'obsoleto. Il principio di base rimane lo stesso, ma alcuni dettagli sono cambiati. Ad esempio, il modo in cui crea il server non funziona più e gli sviluppatori di connessione hanno rimosso parseCookie(). Gli utenti sono not happy con tale decisione, ma la soluzione è così facile da ricordare riga di codice:

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

Come ho detto, l'articolo di cui sopra dovrebbe darvi tutte le basi necessarie, se si vuole vedere un'implementazione di lavoro, dare un'occhiata a questo: https://github.com/vortec/lolbr/blob/master/lib/lolbr.js

All'interno del gestore authorization evento, è possibile modificare l'oggetto data e accedervi in ​​seguito utilizzando socket.handshake, nel tuo caso: socket.handshake.sessionID.

Spero che questo aiuti.

+0

connect non è stato definito nel tuo esempio. Qualche idea da risolvere? – Yagiz

+0

@Alex se clonate '' lolbr'', assicuratevi di avere '' express'' installato sotto di esso. Basta clonare, quindi "cd" dentro e digitare '' npm install''. Questo dovrebbe funzionare – Fabian

+0

Quindi, parseSignedCookies non sono disponibili al momento. Come suggerisci di riscrivere il codice? Non ho familiarità con i cookie in socket.io, ma ho trovato "var cookies = cookie.parse ('foo = bar; cat = meow; dog = ruff');" esempio. Come dovrei implementarlo in questo esempio? – Yagiz