Czuję, że trzeba to gdzieś zakopać w dokumentacji, ale nie mogę tego znaleźć.
Jak zamknąć, zakończyć lub zabić (cokolwiek) sesję w ExpressJS?
Odpowiedzi:
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).
Nieważne, to jest req.session.destroy();
req.session.destroy();
jako acidghost.
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.
Z http://expressjs.com/api.html#cookieSession
Aby wyczyścić plik cookie, po prostu przypisz sesję do wartości null przed udzieleniem odpowiedzi:
req.session = null
posługiwać się,
delete req.session.yoursessionname;
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;
};
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
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.
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