Wie kann ich eine Sitzung mit Socket.io 1.0 und Express 4.x teilen? Ich benutze einen Redis Store, aber ich glaube, das sollte keine Rolle spielen. Ich weiß, dass ich eine Middleware verwenden muss, um Cookies anzusehen und Sitzungen abzurufen, aber ich weiß nicht wie. Ich suchte, konnte aber keine Arbeit finden
var RedisStore = connectRedis(expressSession);
var session = expressSession({
store: new RedisStore({
client: redisClient
}),
secret: mysecret,
saveUninitialized: true,
resave: true
});
app.use(session);
io.use(function(socket, next) {
var handshake = socket.handshake;
if (handshake.headers.cookie) {
var str = handshake.headers.cookie;
next();
} else {
next(new Error('Missing Cookies'));
}
});
{ path: '/', _expires: null, originalMaxAge: null, httpOnly: true, secure: true } }
Aber wenn ich die Sitzung in meinen RoutenVor anderthalb Monaten habe ich mich mit dem gleichen Problem befasst und danach ein umfangreiches geschrieben Blog-Beitrag zu diesem Thema geschrieben, der mit einer voll funktionsfähigen Demo-App zusammenarbeitet, die auf GitHub gehostet wird. Die Lösung basiert auf Express-Session- , Cookie-Parser- und Connect-Redis- Knotenmodulen, um alles miteinander zu verbinden. Sie können auf Sitzungen sowohl im REST- als auch im Sockets-Kontext zugreifen und diese ändern, was sehr nützlich ist.
Die beiden entscheidenden Teile sind das Middleware-Setup:
... und SocketIO Server Setup:
Sie gehören zu einem einfachen sessionService-Modul, das ich erstellt habe und mit dem Sie einige grundlegende Operationen mit Sitzungen ausführen können. Der Code sieht folgendermaßen aus:
Da das Ganze mehr Code enthält (wie das Initialisieren von Modulen, das Arbeiten mit Sockets und REST-Aufrufen sowohl auf der Client- als auch auf der Serverseite), werde ich hier nicht den gesamten Code einfügen, Sie können ihn auf dem GitHub anzeigen und du kannst damit machen was du willst.
quelle
express-socket.io-session
ist eine fertige Lösung für Ihr Problem. Normalerweise hat die am Ende von socket.io erstellte Sitzung eine andere Seite als die in express.js erstellten
Bevor ich diese Tatsache erkannte, als ich sie durcharbeitete, um die Lösung zu finden, fand ich etwas Seltsames. Auf die aus der express.js-Instanz erstellten Sitzungen konnte am Ende von socket.io zugegriffen werden, für das Gegenteil war dies jedoch nicht möglich. Und bald wurde mir klar, dass ich mich durch die Verwaltung von Sid arbeiten muss, um dieses Problem zu lösen. Es wurde jedoch bereits ein Paket geschrieben, um dieses Problem anzugehen. Es ist gut dokumentiert und erledigt die Arbeit. Ich hoffe es hilft
quelle
Mit der Antwort von Bradley Lederholz habe ich es für mich selbst zum Laufen gebracht. Weitere Erläuterungen finden Sie in der Antwort von Bradley Lederholz.
quelle
Ich habe es irgendwie gelöst, aber es ist nicht perfekt. Unterstützt keine signierten Cookies usw. Ich habe die getcookie-Funktion von express-session verwendet. Die modifizierte Funktion lautet wie folgt:
quelle
Jetzt funktioniert die ursprünglich akzeptierte Antwort auch bei mir nicht. Wie bei @ Rahil051 habe ich express-socket.io-session verwendet Modul und es funktioniert immer noch. Dieses Modul verwendet den Cookie-Parser, um die Sitzungs-ID vor dem Aufrufen der Middleware für Express-Sitzungen zu analysieren. Ich denke, die Antwort von @pootzko, @Mustafa und @ Kosar ist ziemlich ähnlich.
Ich benutze diese Module:
Überprüfen Sie die Daten in socket.handshake:
quelle