Node / Express с connect-redis, как обрабатывать истечение срока сеанса

У меня есть приложение Node / Express, которое использует redis в качестве хранилища сеансов.

У меня вопрос относительно обработки истечения срока сеанса.

Я хотел бы иметь активный сеанс до закрытия браузера, поэтому я не устанавливал время окончания сеанса.

При этом файл cookie сеанса работает нормально, но я сомневаюсь в Redis.

Кажется, что пара ключ / значение, хранящаяся в Redis DB, никогда не истекает.

Как правильно с этим справиться?

Есть ли способ настроить redis для уничтожения значения, сохраненного с определенным временем простоя?

Или лучше установить TTL, когда connect-redis вызывается внутри приложения?


Фактическая конфигурация сеанса внутри приложения:

var session = require('express-session');
var RedisStore = require('connect-redis')(session);

app.use(session({
  store: new RedisStore({port:6379, host: 'localhost'}),
  secret: "my-secret-here",
  resave: false,
  saveUninitialized: true }));

person Zauker    schedule 02.08.2016    source источник


Ответы (2)


Используя Redis с экспресс-сеансом, вы можете использовать метод touch () из экспресс-сеанса для сброса TTL. Поэтому, если вы устанавливаете TTL при создании сеанса, сделайте что-то вроде этого на маршрутах, где вы не хотите, чтобы сеанс истекал:

api.get("/someRoute/", (req, res) => {
  req.session.touch();

  // Whatever else you need to do
  res.sendStatus(200);
}

Это сбросит TTL в Redis и предотвратит истечение срока сеанса, если клиент все еще использует ваш API - я предполагаю, что если клиент не взаимодействует с вашим API достаточно долго, это означает, что браузер закрыт или иным образом завершен. используя ваше приложение.

person Levi Morris    schedule 02.08.2016
comment
Метод touch () устанавливает cookie.maxAge? Но для файла cookie сеанса не установлен maxAge. Срок действия cookie истекает при закрытии браузера. Возможно, я мог бы установить TTL для данных, хранящихся в Redis DB, и использовать что-то вроде store.touch () для обновления TTL. Это могло быть правильно? - person Zauker; 02.08.2016
comment
Я попытался установить значение TTL для Redis, предложенная вами команда req.session.touch () работает нормально. Он обновляет время простоя ключа, хранящегося в Redis DB. Большое спасибо. - person Zauker; 02.08.2016

Вы можете указать ttl при создании хранилища сеансов. Дополнительные параметры можно найти в readme.

app.use(session({
    store: new RedisStore(options),
    secret: 'keyboard cat',
    ttl : 20 // ttl is in seconds. From the readme.
}));
person Swaraj Giri    schedule 02.08.2016
comment
Да у меня что-то вроде этого. Я действительно не знал, когда подходить, но я попробую с другими значениями. Как можно сбросить TTL? Я должен использовать req.session.touch (), как предлагает Леви, или что-то вроде store.touch ()? Я этого не понимал. - person Zauker; 02.08.2016
comment
Вы можете использовать touch или просто установить ttl и забыть об этом. - person Swaraj Giri; 02.08.2016