Edit : Après avoir essayé des modules qui n'ont pas fonctionné, j'ai écrit ma propre bibliothèque pour faire cela. Vous pouvez la consulter à l'adresse suivante https://github.com/aviddiviner/Socket.IO-sessions . Je laisse mon ancien message ci-dessous à des fins historiques :
J'ai obtenu ce travail assez proprement sans avoir à contourner la flashsocket transport selon pr0zac de la solution ci-dessus. J'utilise également express avec Socket.IO. Voici comment.
Tout d'abord, passez l'ID de la session à la vue :
app.get('/', function(req,res){
res.render('index.ejs', {
locals: {
connect_sid: req.sessionID
// ...
}
});
});
Puis, dans votre vue, liez-la à 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 la 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 le 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 aidera quelqu'un qui trouve cet article en cherchant sur Google (comme je l'ai fait ;)
6 votes
Ou peut utiliser ce TRES BON poste : danielbaulig.de/socket-ioexpress
3 votes
@FabianoPS - ne fonctionnera plus - connect ne fournit plus la méthode parseCookie sur laquelle cela repose.
1 votes
@UpTheCreek - Puisque connect n'utilise plus la méthode parseCookie, comment cela peut-il être possible ?
0 votes
@Aust - Bonne question, je ne sais pas quelle est la meilleure approche maintenant. C'est vraiment le bazar. Malheureusement, la plupart des discussions sur les solutions de contournement sont également axées sur socket.io (tout le monde n'utilise pas socket.io !). Il y a maintenant une fonction parseSignedCookie, mais elle est aussi privée, donc elle risque de subir des modifications.
0 votes
@UpTheCreek - Après avoir essayé différents modules pendant quelques mois, j'ai fini par faire le mien. session.io .
2 votes
Pour les versions plus récentes de Socket.IO (1.x) et Express (4.x), consultez cette question SO : stackoverflow.com/questions/25532692/