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

use*_*874 37 node.js express mean-stack express-session

我是MEAN堆栈中的新手.我读了快递会话github doc,但有一些我无法清除的选项.那些选择是saveUninitializedresave.

任何人都可以请举例说明使用的优点是什么saveUninitialized,resave以及如果我们在该选项中更改布尔值会产生什么影响.

句法:-

app.use(session({
  resave: false,
  saveUninitialized: true,
}))
Run Code Online (Sandbox Code Playgroud)

rob*_*lep 92

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

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

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

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

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

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

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

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

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

  • 这是一个很好的答案.感谢您花时间写它. (10认同)
  • 什么是“触摸”命令?你说的这个会话存储是在客户端还是服务器端? (2认同)

spe*_*.sm 15

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

  • 哇,这似乎对我有所帮助。谢谢。我正在发布一个类似按钮的请求,并将一个req.sessionID保存到数据库。无论如何,每当我单击按钮时,我都会得到一个新的req.SessionID。那是一个令人恐惧的时刻。无论如何。当我为发布请求处理程序时,我添加了`req.session.liked = id`,现在我没有获得新的会话ID。希望这解决了我的问题。 (2认同)

Yog*_*dav 14

resave:这基本上意味着对于服务器的每个请求,它都会重置会话 cookie。即使请求来自同一用户或浏览器,并且会话在请求期间从未被修改。

saveUninitialized:当创建一个空的session对象并且没有设置任何属性时,就是未初始化状态。所以,设置saveUninitializedfalse如果不修改的话将不会保存会话。

resave和 的默认值saveUninitialized都是true,但不推荐使用默认值。因此,请根据用例设置适当的值。


小智 6

  1. Uninitialized = false
    这意味着当 req.session 中的任何属性被修改时,您的会话仅存储到您的存储中
  2. Uninitialized = true
    这意味着您的会话将在每次请求时存储到您的存储中。不会依赖于req.session的修改。
  3. resave = true
    表示当对session进行修改时,它将重新写入req.session.cookie对象。
  4. resave = false
    不会重写 req.session.cookie 对象。初始 req.session.cookie 保持原样。