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

我是MEAN栈中的新手。 我阅读快速会话github文档,但有一些选项,我无法清除。 该选项是saveUninitializedresave

任何人都可以请示例解释什么是使用saveUninitialized和resave的saveUninitialized和什么会影响,如果我们更改该选项中的布尔值。

句法:-

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

       

网上收集的解决方案 "在快速会话中使用saveUninitialized并重新保存"

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

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

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

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

这背后的原因是,这将防止很多空的会话对象被存储在会话存储中。 由于没有什么用处可以存储,会话在请求结束时被“忘记”了。

你想什么时候启用这个? 例如,当您想要识别经常性访问者时。 您将能够识别这样的访问者,因为他们发送包含唯一ID的会话cookie。

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

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

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

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