Я відчуваю, що це має бути поховано десь у документації, але я не можу його знайти.
Як закрити, закінчити або вбити (що завгодно) сеанс у ExpressJS?
Відповіді:
Обробка сеансів більше не вбудована в Express. Ця відповідь стосується стандартного модуля сеансу: https://github.com/expressjs/session
Щоб очистити дані сеансу, просто використовуйте:
req.session.destroy();
Документація з цього приводу трохи марна. Він говорить:
Знищує сеанс, видаляючи req.session, буде відтворено наступний запит.
req.session.destroy(function(err) { // cannot access session here })
Це не означає, що поточний сеанс буде перезавантажений при наступному запиті. Це означає, що при наступному запиті у вашому сховищі сесій буде створено чистий порожній сеанс. (Імовірно, ідентифікатор сеансу не змінюється, але я не тестував цього.)
Неважливо, це так req.session.destroy();
req.session.destroy();
як кислотний привид.
Питання не уточнило, який тип сховища сесій використовується. Обидві відповіді здаються правильними.
Для сеансів на основі файлів cookie:
З http://expressjs.com/api.html#cookieSession
req.session = null // Deletes the cookie.
Для сесій Redis тощо.
req.session.destroy // Deletes the session in the database.
З http://expressjs.com/api.html#cookieSession
Щоб очистити файл cookie, просто призначте сеансу значення null, перш ніж відповісти:
req.session = null
використовувати,
delete req.session.yoursessionname;
Використовуючи req.session = null;
, насправді не видалить екземпляр сеансу. Найбільш правильним рішенням буде req.session.destroy();
, але це, по суті, обгортка для 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;
};
Знищує сеанс і скасовує властивість req.session. Після завершення буде викликаний зворотний виклик.
↓ Безпечний шлях ↓ ✅
req.session.destroy((err) => {
res.redirect('/') // will always fire after session is destroyed
})
↓ Незахищений спосіб ↓ ❌
req.logout();
res.redirect('/') // can be called before logout is done
req.session.destroy();
Вищевказане не працювало для мене, тому я зробив це.
req.session.cookie.expires = new Date().getTime();
Встановивши термін дії файлу cookie на поточний час, сеанс закінчився самостійно.
Як вже згадувалося в кількох місцях, я також не можу змусити коректно працювати функцію req.session.destroy ().
Це моя робота навколо .. здається, це трюк, і все ще дозволяє використовувати req.flash
req.session = {};
Якщо видалити або встановити req.session = null; , здається, тоді ви не можете використовувати req.flash