express-session中的“saveUninitialized”,“resave”和“rolling”属性的含义是什么?

最近,我正在学习express的中间件“express-session”,我想了解给定选项中的所有属性。但是当我读到express-session的API的时候,我很困惑这三个

属性: saveUninitializedresaverolling

它们都对cookie设置或会话操作有影响,那么它们有什么区别和联系呢?

希望有人能帮我区分他们,

非常感谢!

当一个现代的浏览器发出请求时,它会附加Cookie头中与当前域(网站)匹配的所有cookie。 这里是我的浏览器可能发送的一个例子,如果我访问stackoverflow.com:

Cookie: acct=1234

当您第一次访问网站时,浏览器不会发送cookie。 在这种情况下(例如,如果所有者想要使用cookie来跟踪用户会话),服务器通常会使用Set-Cookie头进行响应,如下所示:

Set-Cookie: acct=5678; expires=Sat, 15 May 2050 15:32:57 GMT; domain=.stackoverflow.com

(它也可以追加pathsecureHttpOnly选项, 这里全部解释)我正在简化,但默认情况下, express-session只在您第一次访问网站时发送Set-Cookie

如果rollingtrue ,它会每次发送。 这具有期望的副作用,即不断滚动每个页面刷新的cookie的到期。 新的到期date是通过将maxAge添加到当前服务器时间来确定的。

如果您更改了req.session对象,则会在请求结束时将其保存回会话存储区; 否则不会被保存。 即使没有进行任何更改,将resave设置为true也会强制每次保存它。 这可能看起来不合逻辑,但是某些商店可能需要这样做(尽pipe通过列表查看,似乎目前没有)。

当第一次设置cookie时,会在内存中创build一个新的会话对象,并在请求结束时保存到存储中。 如果你有很多人访问,然后弹跳而没有执行任何有意义的操作(如login),这可能占用db中的大量空间。如果偏离默认会话对象,则可以select仅保存会话(即,已经修改它,如设置req.session.user = user;login)通过设置saveUninitializedfalse

需要注意的是这些值的某些组合(以及其他值)可能会产生意想不到的行为。 例如,文档指出:

当此选项[rolling]设置为true,但saveUninitialized选项设置为false时,不会在未初始化会话的响应中设置cookie。