我是MEAN堆栈的新手。我阅读了快递会议github doc,但有些选项对我来说并不清楚。这些选项为saveUninitialized
和resave
。
任何人都可以用示例来解释使用saveUninitialized
和resave
的优点是什么,如果我们更改这些选项中的布尔值,效果会是什么。
语法: -
app.use(session({
resave: false,
saveUninitialized: true,
}))
答案 0 :(得分:71)
我们假设全局启用了会话(对于所有请求)。
当客户端发出HTTP请求,并且该请求不包含会话cookie时,express-session
将创建一个新会话。创建新会话可以做一些事情:
req.session
saveUninitialized
的值,在请求结束时,会话对象将存储在会话存储中(通常是某种数据库)如果在请求的生命周期内未修改会话对象,则在请求结束时以及saveUninitialized
false 时,(仍为空,因为未修改)会话对象不会存储在会话存储中。
这背后的原因是这将阻止大量空会话对象存储在会话存储中。由于存储没有任何用处,因此会话在请求结束时被“遗忘”。
您想何时启用此功能?例如,当您希望能够识别重复访问者时。您将能够识别这样的访问者,因为他们发送包含唯一ID的会话cookie。
关于resave
:可能必须为不支持“touch”命令的会话存储启用此功能。这样做是告诉会话存储特定会话仍处于活动状态,这是必要的,因为一些存储将在一段时间后删除空闲(未使用)会话。
如果会话存储驱动程序未实现touch命令,则应启用resave
,以便即使在请求期间未更改会话时,它仍会在存储中更新(从而标记它)活性)。
因此,如果您需要启用此选项,则完全取决于您正在使用的会话存储。
答案 1 :(得分:11)
需要注意的一点是,如果将saveUninitialized
设置为 false ,则除非会话被修改,否则不会在浏览器上设置会话cookie。这种行为可能是隐含的,但当我第一次阅读documentation时,我并不清楚这一行为。
答案 2 :(得分:1)
resave
:这基本上意味着对于服务器的每个请求,它都会重置会话 cookie。即使请求来自同一用户或浏览器,并且在请求期间从未修改过会话。
saveUninitialized
:当创建一个空的会话对象并且没有设置属性时,就是未初始化状态。因此,如果会话未被修改,将 saveUninitialized
设置为 false 将不会保存会话。
resave
和 saveUninitialized
的默认值都是 true,但不推荐使用默认值。因此,请根据用例设置适当的值。
答案 3 :(得分:0)
on saveUninitialized set true server 将向浏览器提供会话cookie并将其保存在其内存中,即使您没有对会话对象进行任何修改。但是当后面的字段设置为 false 时,服务器只会在您修改会话对象时提供会话 cookie,如果您已经拥有会话 cookie 那就不用担心了!!
答案 4 :(得分:0)
我得出一个结论:
1.当您将 saveUninitialized
设置为 false
时,如果您创建的会话对象没有被修改,即留空,那么您将无法在浏览器 cookie 中看到 connect.sid .这最终会迫使您的商店不存储会话对象,因为它尚未被修改,即未初始化。 true
反之亦然。
例如:
const express = require('express');
const dotenv = require("dotenv").config();
const app = express();
const session = require("express-session");
app.use(session({
secret:"cat",
resave:false,
saveUninitialized:false,
cookie:{httpOnly:true}
}));
app.get('/login',(req,res)=>{
// req.session.user="sundar";
// req.session.admin=true;
console.log(req.sessionID);
res.send(req.session.user);
})
app.post("/upload",(req,res)=>{
console.log(req.session);
if (req.session.user === "sundar") {
res.send("uploaded" + req.session.user)
}else{
res.send("failed");
}
})
app.listen(process.env.PORT, () => {
console.log(`Listening on http://localhost:${process.env.PORT}`);
});
在本例中,如果您从邮递员或浏览器点击 /login
并且查看 cookie,您将看不到 connect.id,因为创建的会话对象没有被修改。强>
但是如果您将 /login
修改为:
app.get('/login',(req,res)=>{
req.session.user="sundar";
req.session.admin=true;
/* here we modified session object by adding user and admin properties to object created */
res.send(req.session.user);
})
因此您可以看到在浏览器或邮递员 cookie 部分设置了 connect.id cookie。这也意味着如果您有一个商店与您的会话中间件相连,现在您的会话将存储在商店中。
resave
设置为 true
,那么对于每个请求,您的 session-cookie 每次都会被重置。参考:click here to read