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

新手上路,请多包涵

我是MEAN堆栈的新手。我阅读了 express-session github 文档,但有一些我不清楚的选项。这些选项是 saveUninitializedresave

谁能 举例 说明使用 saveUninitializedresave 的优点是什么,如果我们更改这些选项中的布尔值会有什么影响。

句法:-

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

原文由 user7104874 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.2k
2 个回答

让我们假设会话是全局启用的(对于所有请求)。

当客户端发出 HTTP 请求并且该请求不包含会话 cookie 时,将由 express-session 创建一个新会话。创建一个新会话会做一些事情:

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

如果在请求的生命周期中会话对象没有被修改,那么在请求结束时,当 saveUninitializedfalse 时,(仍然为空,因为未修改)会话对象将不会存储在会话存储。

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

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

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

如果会话存储驱动程序没有实现 touch 命令,那么您应该启用 resave 以便即使在请求期间会话没有更改,它仍然在存储中更新(从而将其标记为活动)。

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

原文由 robertklep 发布,翻译遵循 CC BY-SA 3.0 许可协议

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

原文由 spencer.sm 发布,翻译遵循 CC BY-SA 3.0 许可协议

推荐问题