Как завершить сеанс в ExpressJS

88

Мне кажется, это должно быть где-то в документации, но я не могу его найти.

Как закрыть или завершить или убить (что угодно) сеанс в ExpressJS?

Стивен
источник

Ответы:

122

Обновленный ответ Express 4.x

Обработка сеансов больше не встроена в Express. Этот ответ относится к стандартному модулю сеанса: https://github.com/expressjs/session

Чтобы очистить данные сеанса, просто используйте:

req.session.destroy();

Документация по этому поводу немного бесполезна. Он говорит:

Уничтожает сеанс, удаляя req.session, при следующем запросе будет повторно сгенерирован. req.session.destroy(function(err) { // cannot access session here })

Это не означает, что текущий сеанс будет перезагружен при следующем запросе. Это означает, что при следующем запросе в вашем хранилище сеансов будет создан чистый пустой сеанс. (Предположительно идентификатор сеанса не меняется, но я этого не проверял.)

Брэд
источник
есть ли способ уничтожить сеанс из сеансов, а не из немедленного запроса. Например, если бы я реализовал функцию вывода меня из всех устройств, мне бы это понадобилось
Мухаммад Умер
1
@MuhammadUmer Насколько я знаю, встроенного механизма для разрушения произвольной сессии нет. Вы можете легко реализовать это самостоятельно, удалив ключи, связанные с сеансом, из хранилища или создав свою собственную оболочку сеанса.
Брэд,
93

Неважно, это req.session.destroy();

Стивен
источник
8
У меня это не работает на экспрессе 3 .. Я пытаюсь вызвать ´req.session.destroy () ´
acidghost 01
6
У меня отлично работает на ExpressJS 3.00. Используется req.session.destroy();как acidghost.
гексацианид
1
использование req.session.destroy () также работает для меня в экспрессе 2.5
TulioPa
1
Где это задокументировано? Я пытаюсь его найти.
huggie
25

Вопрос не прояснил, какой тип хранилища сеансов используется. Оба ответа кажутся правильными.

Для сеансов на основе файлов cookie:

Из http://expressjs.com/api.html#cookieSession

req.session = null // Deletes the cookie.

Для сессий на основе Redis и т. Д .:

req.session.destroy // Deletes the session in the database.
Синие рубашки
источник
1
req.session.destroy - это, по сути, обертка для «удаления req.session», см. исходный код здесь: github.com/expressjs/session/blob/master/session/session.js
tfmontague
6

использовать

delete req.session.yoursessionname;
Нитин
источник
Я действительно хотел бы увидеть документ об этом.
Ленивый
5
Для всех тех, кто проголосовал против @Nithin; метод-функция session.destroy (), как описано на github (github.com/expressjs/session/blob/master/session/session.js), использует "delete this.req.session" - это не совсем ответ @Nithin, но использование «удалить» также является правильным решением (и не рассматривается в других ответах).
tfmontague
Это правильное решение? Никакой утечки памяти, ничего плохого не случится?
Rajath
5

Использование 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;
};
tfmontague
источник
5

Session.destroy (обратный вызов)

Уничтожает сеанс и отключает свойство 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
Хасан Сефа Озалп
источник
0
req.session.destroy(); 

Вышеупомянутое не сработало для меня, поэтому я сделал это.

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

Установив срок действия cookie на текущее время, сеанс истек сам по себе.

Джон Квазар
источник
-5

Как упоминалось в нескольких местах, я также не могу заставить функцию req.session.destroy () работать правильно.

Это моя работа ... похоже, помогает, и все же позволяет использовать req.flash

req.session = {};

Если вы удалите или установите req.session = null; , значит, вы не можете использовать req.flash

Джин Бо
источник
1
Это проблема безопасности, поскольку она не меняет хэш сеанса,
Тош