Jak zakończyć sesję w ExpressJS

88

Czuję, że trzeba to gdzieś zakopać w dokumentacji, ale nie mogę tego znaleźć.

Jak zamknąć, zakończyć lub zabić (cokolwiek) sesję w ExpressJS?

Stephen
źródło

Odpowiedzi:

122

Express 4.x Zaktualizowana odpowiedź

Obsługa sesji nie jest już wbudowana w Express. Ta odpowiedź odnosi się do standardowego modułu sesji: https://github.com/expressjs/session

Aby wyczyścić dane sesji, po prostu użyj:

req.session.destroy();

Dokumentacja jest w tym trochę bezużyteczna. To mówi:

Niszczy sesję, usuwa req.session, zostanie ponownie wygenerowane następne żądanie. req.session.destroy(function(err) { // cannot access session here })

Ten sposób nie oznacza, że bieżąca sesja zostanie ponownie załadowany na następne żądanie. Oznacza to, że przy następnym żądaniu w Twoim magazynie sesji zostanie utworzona czysta, pusta sesja. (Prawdopodobnie identyfikator sesji się nie zmienia, ale nie testowałem tego).

Ćwiek
źródło
czy istnieje sposób na usunięcie sesji z sesji, a nie natychmiastowego żądania. Na przykład, gdybym miał zaimplementować, wyloguj mnie ze wszystkich funkcji urządzeń, potrzebowałbym tego
Muhammad Umer
1
@MuhammadUmer O ile wiem, nie ma wbudowanego mechanizmu niszczenia arbitralnej sesji. Możesz to łatwo zaimplementować samodzielnie, usuwając klucze związane z sesją z pamięci lub tworząc własne opakowanie sesji.
Brad
93

Nieważne, to jest req.session.destroy();

Stephen
źródło
8
To nie działa dla mnie w Express 3 .. Próbuję wywołać ´req.session.destroy () ´
acidghost
6
Działa dobrze dla mnie na ExpressJS 3.00. Używany req.session.destroy();jako acidghost.
heksacyjanid
1
użycie req.session.destroy () działa również u mnie w express 2.5
TulioPa
1
Gdzie to jest udokumentowane? Próbuję to znaleźć.
przytulanie
25

Pytanie nie wyjaśniało, jaki typ magazynu sesji był używany. Obie odpowiedzi wydają się prawidłowe.

W przypadku sesji opartych na plikach cookie:

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

req.session = null // Deletes the cookie.

W przypadku sesji opartych na Redis itp .:

req.session.destroy // Deletes the session in the database.
Blueshirts
źródło
1
req.session.destroy jest w istocie opakowaniem dla „delete req.session”, zobacz kod źródłowy tutaj: github.com/expressjs/session/blob/master/session/session.js
tfmontague
6

posługiwać się,

delete req.session.yoursessionname;
Nithin
źródło
Naprawdę chciałbym zobaczyć dokument na ten temat.
Leniwy
5
Dla wszystkich, którzy głosują w dół @Nithin; metoda funkcji session.destroy (), jak udokumentowano na github (github.com/expressjs/session/blob/master/session/session.js) używa „delete this.req.session” - nie jest to dokładnie odpowiedź @ Nithin, ale użycie opcji „usuń” jest również poprawnym rozwiązaniem (i nie zostało uwzględnione w innych odpowiedziach).
tfmontague
Czy to jest właściwe rozwiązanie? Żadnego wycieku pamięci, nic złego się nie wydarzy, prawda?
Rajath
5

Użycie req.session = null;nie spowoduje usunięcia instancji sesji. Najwłaściwszym rozwiązaniem byłoby req.session.destroy();, ale jest to zasadniczo opakowanie 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
źródło
5

Session.destroy (wywołanie zwrotne)

Niszczy sesję i usuwa właściwość req.session. Po zakończeniu wywołanie zwrotne zostanie wywołane.

Bezpieczny sposób ↓ ✅

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

Niezabezpieczony sposób ↓ ❌

req.logout();
res.redirect('/') // can be called before logout is done
Hasan Sefa Ozalp
źródło
0
req.session.destroy(); 

Powyższe nie zadziałało, więc zrobiłem to.

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

Ustawiając datę wygaśnięcia pliku cookie na aktualny czas, sesja wygasła sama.

John Quasar
źródło
-5

Jak wspomniano w kilku miejscach, nie jestem również w stanie zmusić funkcji req.session.destroy () do prawidłowego działania.

To jest moja obejście ... wydaje się działać i nadal pozwala na użycie req.flash

req.session = {};

Jeśli usuniesz lub ustawisz req.session = null; , wygląda na to, że nie możesz użyć req.flash

Gene Bo
źródło
1
Jest to kwestia bezpieczeństwa, ponieważ nie zmienia ona wartości skrótu sesji
Tosh,