Modifica: dopo aver provato alcuni moduli che non funzionavano, in realtà sono andato e ho scritto la mia libreria per farlo. Spina senza vergogna: dai un'occhiata a https://github.com/aviddiviner/Socket.IO-sessions . Lascio il mio vecchio post qui sotto per scopi storici:
Ho ottenuto questo lavoro abbastanza ordinatamente senza dover bypassare il trasporto flashsocket come per la soluzione di pr0zac sopra. Sto anche usando express con Socket.IO. Ecco come.
Innanzitutto, passa l'ID della sessione alla vista:
app.get('/', function(req,res){
res.render('index.ejs', {
locals: {
connect_sid: req.sessionID
// ...
}
});
});
Quindi, a tuo avviso, collegalo con Socket.IO lato client:
<script>
var sid = '<%= connect_sid %>';
var socket = new io.Socket();
socket.connect();
</script>
<input type="button" value="Ping" onclick="socket.send({sid:sid, msg:'ping'});"/>
Quindi nel tuo listener Socket.IO lato server, raccoglilo e leggi / scrivi i dati della sessione:
var socket = io.listen(app);
socket.on('connection', function(client){
client.on('message', function(message){
session_store.get(message.sid, function(error, session){
session.pings = session.pings + 1 || 1;
client.send("You have made " + session.pings + " pings.");
session_store.set(message.sid, session); // Save the session
});
});
});
Nel mio caso, il mio session_store
è Redis, utilizzando la redis-connect
libreria.
var RedisStore = require('connect-redis');
var session_store = new RedisStore;
// ...
app.use(express.session({ store: session_store }));
Spero che questo aiuti qualcuno che trova questo post durante la ricerca su Google (come ho fatto io;)