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_storees Redis, usando la redis-connectbiblioteca.
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;)