Edit: Après avoir essayé des modules qui ne fonctionnaient pas, j'ai en fait écrit ma propre bibliothèque pour ce faire. Prise sans vergogne: allez le vérifier sur https://github.com/aviddiviner/Socket.IO-sessions . Je laisserai mon ancien message ci-dessous à des fins historiques:
Je suis tout à fait ce travail d'une manière ordonnée sans avoir à contourner le flashsocket de transport selon pr0zac la solution « ci - dessus. J'utilise également express avec Socket.IO. Voici comment.
Commencez par transmettre l'ID de session à la vue:
app.get('/', function(req,res){
res.render('index.ejs', {
locals: {
connect_sid: req.sessionID
// ...
}
});
});
Ensuite, dans votre vue, liez-le avec Socket.IO côté 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'});"/>
Ensuite, dans votre écouteur Socket.IO côté serveur, récupérez-le et lisez / écrivez les données de session:
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
});
});
});
Dans mon cas, mon session_store
est Redis, en utilisant la redis-connect
bibliothèque.
var RedisStore = require('connect-redis');
var session_store = new RedisStore;
// ...
app.use(express.session({ store: session_store }));
J'espère que cela aide quelqu'un qui trouve ce message lors d'une recherche sur Google (comme je l'ai fait;)