Nach dem Neustart konnte keine Session für Socket in sailsjs abgerufen werden

8

Ich versuche Socket-basierte Anwendung auf sailsjs zu bauen, es ist klein und ich brauche nur Speicher-Session-Adapter, aber wenn ich die Anwendung neu starte, bekomme ich nach socket.get('/') :

%Vor%

Ich verstehe, dass meine Sitzung verloren gegangen ist, kann aber keine Möglichkeit finden, sie wiederherzustellen oder sich sogar um diesen Fehler zu kümmern.

Gibt es eine Möglichkeit, ein neues Session-Cookie für Socket anzufordern, ohne die Seite neu zu laden?

    
zb' 14.01.2014, 05:59
quelle

2 Antworten

12

Das Problem hier ist, dass Sails standardmäßig MemoryStore verwendet, um Sitzungen zu behandeln, was bedeutet, dass wenn Sie Sails senken (oder wenn die Anwendung abstürzt, auch wenn sie mit forever usw. neu gestartet wird) einfach automatisch weg sein.

Die Lösung ist so einfach wie das Ändern der Sitzungsbehandlung zu einem externen Adapter. In config/session.js standardmäßig erzeugt, haben Sie bereits zwei Beispiele für die Einrichtung eines solchen Adapters, nämlich für Redis und MongoDB, Sie müssen also nur die entsprechenden Zeilen auskommentieren (und ein Komma nach secret -Wert nicht vergessen) ). Zum Beispiel, wenn Sie mit Mongo gehen, wird es etwas wie

sein %Vor%

Natürlich sollte in diesem Fall mongod auf Ihrem Computer laufen.

AKTUALISIEREN

Ok, wenn es eine MemoryStore-Beschränkung gibt, die nicht vermieden werden kann (das war die ursprüngliche Frage), dann wird die Reinitialisierung der Socket-Sitzung ohne erneutes Laden der Seite ein bisschen schwierig, aber immer noch möglich. Um das zu tun, sollte man:

  1. Stellen Sie eine AJAX (oder JSONP im Falle einer CORS) Anfrage an Ihren Server, um die neue Sitzungs-ID zu erhalten. Zum Beispiel kann es so einfach sein, dass ein Controller einen JSON mit der Sitzungs-ID zurückgibt, sagen wir api/controllers/TestController.js :

    module.exports = { index: function(req, res) { res.send(req.sessionID); } };

Wenn Sie also festgestellt haben, dass die Sitzung verloren gegangen ist, verwenden Sie $.get('/test') , um die neue Sitzungs-ID zu erhalten.

  1. Übergeben Sie die neue Sitzungs-ID als cookie -Parameter, während Sie den Socket erneut verbinden:

    socket.socket.connect('/?cookie=<newSessionID>')

  2. socket.get("/", function (response) { console.log(response); }) wird danach funktionieren.

Es ist eine Art schneller Hack, und es gibt wahrscheinlich einen eleganteren Weg, es zu umhüllen (zB Sitzungs-ID in Kopfzeilen senden, nicht im Körper usw.), aber die Idee ist einfach: eine AJAX-Anfrage machen eine neue Sitzung und übergeben Sie ihre ID als cookie -Parameter, um den Socket erneut zu verbinden.

    
bredikhin 16.01.2014, 17:55
quelle
1

Ich hatte das gleiche Problem, und als ich dieses Problem gelesen habe, habe ich festgestellt, dass eine neue Sitzung stattfinden wird erstellt werden, direkt nach einer HTTP-Anfrage an die Segel. Ich habe das Frontend getrennt auf statischen Dateien, daher verwende ich nur socket.io in Richtung Segel, und das ist der Grund, warum die Sitzung nicht erneuert wird.

Wenn eine Sitzung abgelaufen ist, sollte sie entweder mit einem permanenten oder einem flüchtigen Sitzungsadapter erneuert werden.

Also, ohne die Notwendigkeit, zu einem persistenten Adapter zu wechseln, habe ich einfach eine leere Datei unter dem Segel-Assets-Ordner hinzugefügt, wie in assets/js/renew-session.js (leere Datei), und sie als Skript in den Index meiner App aufgenommen. Auf diese Weise erneuert die anfängliche HTTP-Anfrage die Cookies.

Vielleicht kann das für jemand anderen nützlich sein

    
danza 16.04.2014 09:28
quelle

Tags und Links