何时使用saveUninitialized并在快速会话中重新保存

问题描述 投票:28回答:2

我是MEAN堆栈的新手。我读了快递会github doc,但有一些选项对我来说不清楚。这些选项是saveUninitializedresave

任何人都可以用例子解释使用saveUninitializedresave有什么好处,如果我们改变那些选项中的布尔值,效果会是什么。

句法:-

app.use(session({
  resave: false,
  saveUninitialized: true,
}))
node.js express mean-stack express-session
2个回答
82
投票

假设全局启用会话(对于所有请求)。

当客户端发出HTTP请求,并且该请求不包含会话cookie时,express-session将创建一个新会话。创建新会话有以下几点:

  • 生成唯一的会话ID
  • 将会话ID存储在会话cookie中(以便可以识别客户端发出的后续请求)
  • 创建一个空的会话对象,如req.session
  • 取决于saveUninitialized的值,在请求结束时,会话对象将存储在会话存储(通常是某种数据库)中

如果在请求的生命周期中未更改会话对象,则在请求结束时以及当saveUninitialized为false时,(仍然为空,因为未修改)会话对象将不会存储在会话存储中。

这背后的原因是这将阻止大量空会话对象存储在会话存储中。由于存储没有任何用处,因此会话在请求结束时被“遗忘”。

您想什么时候启用它?例如,当您希望能够识别重复访问者时。您将能够识别这样的访问者,因为他们发送包含唯一ID的会话cookie。

关于resave:可能必须为不支持“touch”命令的会话存储启用此功能。这样做是告诉会话存储特定会话仍处于活动状态,这是必要的,因为一些存储将在一段时间后删除空闲(未使用)会话。

如果会话存储驱动程序未实现touch命令,则应启用resave,以便即使在请求期间未更改会话时,它仍会在存储中更新(从而将其标记为活动状态)。

因此,如果您需要启用此选项,则完全取决于您正在使用的会话存储。


12
投票

需要注意的一点是,如果将saveUninitialized设置为false,则除非会话被修改,否则不会在浏览器上设置会话cookie。这种行为可能是隐含的,但当我第一次阅读documentation时,我并不清楚。

© www.soinside.com 2019 - 2024. All rights reserved.