Je dois signaler ici que vous n'ajoutez pas correctement un intergiciel à l'application. Le site app.use
ne doivent pas être effectués dans le cadre de la app.get
mais en dehors de celui-ci. Il suffit de les appeler directement après createServer
ou consultez le site les autres exemples dans la documentation .
Le secret que vous passez à express.session
devrait être une constante de type chaîne de caractères, ou peut-être quelque chose pris dans un fichier de configuration. Ne lui donnez pas quelque chose que le client pourrait connaître, c'est en fait dangereux. C'est un secret que seul le serveur doit connaître.
Si vous voulez stocker l'adresse électronique dans la session, il suffit de faire quelque chose du genre :
req.session.email = req.param('email');
Ceci étant dit...
Si je comprends bien, ce que vous essayez de faire, c'est de traiter une ou plusieurs requêtes HTTP et de garder la trace d'une session, puis plus tard d'ouvrir une connexion Socket.IO à partir de laquelle vous avez également besoin des données de session.
Ce qui est délicat dans ce problème, c'est que le moyen utilisé par Socket.IO pour faire fonctionner la magie sur n'importe quel ordinateur http.Server
c'est en détournant le request
événement. Ainsi, les "Express" (ou plutôt Connectez-vous à ) n'est jamais appelé sur la connexion Socket.IO.
Je pense que vous pouvez faire en sorte que cela fonctionne, cependant, avec un peu d'astuce.
Vous pouvez accéder aux données de session de Connect ; il vous suffit d'obtenir une référence au magasin de session. La façon la plus simple de le faire est de créer le magasin vous-même avant d'appeler la commande express.session
:
// A MemoryStore is the default, but you probably want something
// more robust for production use.
var store = new express.session.MemoryStore;
app.use(express.session({ secret: 'whatever', store: store }));
Chaque magasin de session possède un get(sid, callback)
méthode. Le site sid
ou l'ID de la session, est stocké dans un cookie sur le client. Le nom par défaut de ce cookie est connect.sid
. (Mais vous pouvez lui donner n'importe quel nom en spécifiant un nom de type key
dans votre express.session
appel.)
Ensuite, vous devez accéder à ce cookie sur la connexion Socket.IO. Malheureusement, Socket.IO ne semble pas vous donner l'accès au cookie. http.ServerRequest
. Une solution de contournement simple consisterait à récupérer le cookie dans le navigateur et à l'envoyer via la connexion Socket.IO.
Le code sur le serveur ressemblerait alors à ce qui suit :
var io = require('socket.io'),
express = require('express');
var app = express.createServer(),
socket = io.listen(app),
store = new express.session.MemoryStore;
app.use(express.cookieParser());
app.use(express.session({ secret: 'something', store: store }));
app.get('/', function(req, res) {
var old = req.session.email;
req.session.email = req.param('email');
res.header('Content-Type', 'text/plain');
res.send("Email was '" + old + "', now is '" + req.session.email + "'.");
});
socket.on('connection', function(client) {
// We declare that the first message contains the SID.
// This is where we handle the first message.
client.once('message', function(sid) {
store.get(sid, function(err, session) {
if (err || !session) {
// Do some error handling, bail.
return;
}
// Any messages following are your chat messages.
client.on('message', function(message) {
if (message.email === session.email) {
socket.broadcast(message.text);
}
});
});
});
});
app.listen(4000);
Cela suppose que vous souhaitez uniquement lire une session existante. Vous ne pouvez pas réellement créer ou supprimer des sessions, car les connexions Socket.IO peuvent ne pas avoir de réponse HTTP à envoyer à l'utilisateur. Set-Cookie
dans l'en-tête (pensez aux WebSockets).
Si vous voulez modifier les sessions, cela peut fonctionner avec certains magasins de session. Un CookieStore ne fonctionnerait pas, par exemple, parce qu'il doit également envoyer un message de type Set-Cookie
ce qui n'est pas le cas. Mais pour les autres magasins, vous pouvez essayer d'appeler la fonction set(sid, data, callback)
et voyez ce qui se passe.