При использовании saveUninitialized и resave в экспресс-сеансе

Я новичок в среднем стеке. Читаю экспресс-сессию гитхаб док но есть какой-то вариант, который я не могу очистить. Это варианты saveUninitialized и resave.

может кто-нибудь объяснить с пример что такое advatanges использования saveUninitialized и resave и что произойдет, если мы изменим логическое значение в этих параметрах.

синтаксис:-

app.use(session({
  resave: false,
  saveUninitialized: true,
}))

2 ответов


предположим, что сеансы глобально (для всех запросов).

когда клиент делает HTTP-запрос, и этот запрос не содержит cookie сеанса, новый сеанс будет создан express-session. Создание нового сеанса делает несколько вещей:

  • создать уникальный идентификатор сеанса
  • сохраните этот идентификатор сеанса в файле cookie сеанса (так что последующие запросы, сделанные клиентом, могут быть идентифицированы)
  • создать пустой объект сеанса , as req.session
  • в зависимости от значения saveUninitialized, в конце запроса объект сеанса будет храниться в хранилище сеансов (которое обычно является своего рода базой данных)

если в течение срока действия запроса объект сеанса не изменяется, то в конце запроса и когда saveUninitialized и false, (все еще пустой, потому что немодифицированный) объект сеанса не будет сохранен в хранилище сеансов.

рассуждение за этим стоит то, что это предотвратит много пустых объектов сеанса, хранящихся в хранилище сеансов. Поскольку нет ничего полезного для хранения, сеанс "забывается" в конце запроса.

когда вы хотите включить это? Например, когда вы хотите иметь возможность идентифицировать повторяющихся посетителей. Вы сможете распознать такого посетителя, потому что они отправляют файл cookie сеанса, содержащий уникальный идентификатор.

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

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

так что это полностью зависит в хранилище сеансов, которое вы используете, если вам нужно включить этот параметр или нет.


следует отметить, что если вы установите saveUninitialized до false файл cookie сеанса не будет установлен в браузере, если сеанс будет изменен. Это поведение может подразумеваться, но мне было неясно, когда я впервые читал документация.