Edit: Depois de tentar alguns módulos que não funcionaram, eu na verdade escrevi minha própria biblioteca para fazer isso. Plugue sem vergonha: vá dar uma olhada em https://github.com/aviddiviner/Socket.IO-sessions . Vou deixar meu antigo post abaixo para fins históricos:
Eu fiz este trabalho perfeitamente sem ter que contornar o transporte flashsocket conforme a solução do pr0zac acima. Também estou usando o expresso com Socket.IO. Veja como.
Primeiro, passe o ID da sessão para a vista:
app.get('/', function(req,res){
res.render('index.ejs', {
locals: {
connect_sid: req.sessionID
// ...
}
});
});
Em sua visão, vincule-o ao lado do cliente 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'});"/>
Em seguida, no listener Socket.IO do lado do servidor, pegue-o e leia / grave os dados da sessão:
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
});
});
});
No meu caso, o meu session_store
é Redis, usando a redis-connect
biblioteca.
var RedisStore = require('connect-redis');
var session_store = new RedisStore;
// ...
app.use(express.session({ store: session_store }));
Espero que isso ajude alguém que encontra esta postagem enquanto pesquisa no Google (como eu fiz;)