Editar: Después de probar algunos módulos que no funcionaron, en realidad fui y escribí mi propia biblioteca para hacer esto. Enchufe desvergonzado: échale un vistazo a https://github.com/aviddiviner/Socket.IO-sessions . Dejaré mi publicación anterior a continuación con fines históricos:
Obtuve este trabajo bastante bien sin tener que omitir el transporte de flashsocket según pr0zac la solución de anterior. También estoy usando express con Socket.IO. Así es cómo.
Primero, pase el ID de sesión a la vista:
app.get('/', function(req,res){
res.render('index.ejs', {
locals: {
connect_sid: req.sessionID
// ...
}
});
});
Luego, en su opinión, vincúlelo con el lado del cliente de Socket.IO:
<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'});"/>
Luego, en el oyente Socket.IO del lado del servidor, recójalo y lea / escriba los datos de la sesión:
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
});
});
});
En mi caso, mi session_store
es Redis, usando la redis-connect
biblioteca.
var RedisStore = require('connect-redis');
var session_store = new RedisStore;
// ...
app.use(express.session({ store: session_store }));
Espero que esto ayude a alguien que encuentre esta publicación mientras busca en Google (como hice yo;)