So beenden Sie eine Sitzung in ExpressJS

88

Ich habe das Gefühl, dass dies irgendwo in der Dokumentation vergraben sein muss, aber ich kann es nicht finden.

Wie können Sie eine Sitzung in ExpressJS schließen, beenden oder beenden (was auch immer)?

Stephen
quelle

Antworten:

120

Express 4.x Aktualisierte Antwort

Die Sitzungsbehandlung ist nicht mehr in Express integriert. Diese Antwort bezieht sich auf das Standard-Sitzungsmodul: https://github.com/expressjs/session

Verwenden Sie zum Löschen der Sitzungsdaten einfach:

req.session.destroy();

Die Dokumentation ist dazu etwas nutzlos. Es sagt:

Zerstört die Sitzung, entfernt die Anforderung und wird bei der nächsten Anforderung neu generiert. req.session.destroy(function(err) { // cannot access session here })

Dies bedeutet nicht , dass die aktuelle Sitzung bei der nächsten Anforderung erneut geladen wird. Dies bedeutet, dass bei der nächsten Anforderung eine saubere leere Sitzung in Ihrem Sitzungsspeicher erstellt wird. (Vermutlich ändert sich die Sitzungs-ID nicht, aber das habe ich nicht getestet.)

Brad
quelle
Gibt es eine Möglichkeit, eine Sitzung aus Sitzungen und nicht aus der unmittelbaren Anforderung heraus zu zerstören? Wenn ich zum Beispiel implementieren würde, mich von allen
Muhammad Umer
1
@ MuhammadUmer Soweit ich weiß, gibt es keinen eingebauten Mechanismus, um eine beliebige Sitzung zu zerstören. Sie können dies einfach selbst implementieren, indem Sie die mit der Sitzung verknüpften Schlüssel aus dem Speicher löschen oder einen eigenen Sitzungs-Wrapper erstellen.
Brad
92

Egal, es ist req.session.destroy();

Stephen
quelle
8
Dies funktioniert bei Express 3 nicht für mich. Ich versuche, ´req.session.destroy () ´
acidghost
6
Funktioniert gut für mich mit ExpressJS 3.00. Wird req.session.destroy();als Acidghost verwendet.
Hexacyanid
1
Die Verwendung von req.session.destroy () funktioniert auch für mich in Express 2.5
TulioPa
1
Wo ist das dokumentiert? Ich versuche es zu finden.
Huggie
24

Die Frage stellte nicht klar, welche Art von Sitzungsspeicher verwendet wurde. Beide Antworten scheinen richtig zu sein.

Für Cookie-basierte Sitzungen:

Von http://expressjs.com/api.html#cookieSession

req.session = null // Deletes the cookie.

Für Redis usw. -basierte Sitzungen:

req.session.destroy // Deletes the session in the database.
Blueshirts
quelle
1
req.session.destroy ist im Wesentlichen ein Wrapper für "delete req.session", siehe den Quellcode hier: github.com/expressjs/session/blob/master/session/session.js
tfmontague
5

verwenden,

delete req.session.yoursessionname;
Nithin
quelle
Ich würde wirklich gerne ein Dokument darüber sehen.
Fauler
5
Für alle, die @Nithin herabgestimmt haben; Die auf github (github.com/expressjs/session/blob/master/session/session.js) dokumentierte Funktionsmethode session.destroy () verwendet "delete this.req.session" - es ist nicht genau die Antwort von @ Nithin, aber Die Verwendung von "Löschen" ist ebenfalls eine korrekte Lösung (und wird in anderen Antworten nicht behandelt).
Montag
Ist dies die richtige Lösung? Kein Speicherverlust, irgendetwas Schelmisches wird nicht passieren, oder?
Rajath
5

Mit req.session = null;wird die Sitzungsinstanz nicht gelöscht. Die am besten geeignete Lösung wäre req.session.destroy();, aber dies ist im Wesentlichen ein Wrapper für delete req.session;.

https://github.com/expressjs/session/blob/master/session/session.js

Session.prototype.destroy = function(fn){
  delete this.req.session;
  this.req.sessionStore.destroy(this.id, fn);
  return this;
};
tfmontague
quelle
4

Session.destroy (Rückruf)

Zerstört die Sitzung und hebt die Eigenschaft req.session auf. Nach Abschluss wird der Rückruf aufgerufen.

Sicherer Weg ↓ ✅

req.session.destroy((err) => {
  res.redirect('/') // will always fire after session is destroyed
})

Unsicherer Weg ↓ ❌

req.logout();
res.redirect('/') // can be called before logout is done
Hasan Sefa Ozalp
quelle
0
req.session.destroy(); 

Das obige hat bei mir nicht funktioniert, also habe ich das gemacht.

req.session.cookie.expires = new Date().getTime();

Durch Setzen des Ablaufs des Cookies auf die aktuelle Zeit lief die Sitzung von selbst ab.

John Quasar
quelle
-5

Wie an mehreren Stellen erwähnt, kann ich auch die Funktion req.session.destroy () nicht ordnungsgemäß ausführen.

Dies ist meine Arbeit. Scheint den Trick zu tun und erlaubt trotzdem die Verwendung von req.flash

req.session = {};

Wenn Sie req.session = null löschen oder setzen ; , anscheinend können Sie req.flash nicht verwenden

Gene Bo
quelle
1
Dies ist ein Sicherheitsproblem, da es den Sitzungs-Hash nicht ändert
Tosh