何时使用saveUninitialized并在快递会话

时间:2016-11-02 13:39:39

标签: node.js express mean-stack express-session

我是MEAN堆栈的新手。我阅读了快递会议github doc,但有些选项对我来说并不清楚。这些选项为saveUninitializedresave

任何人都可以用示例来解释使用saveUninitializedresave的优点是什么,如果我们更改这些选项中的布尔值,效果会是什么。

语法: -

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

5 个答案:

答案 0 :(得分:71)

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

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

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

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

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

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

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

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

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

答案 1 :(得分:11)

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

答案 2 :(得分:1)

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

saveUninitialized:当创建一个空的会话对象并且没有设置属性时,就是未初始化状态。因此,如果会话未被修改,将 saveUninitialized 设置为 false 将不会保存会话。

resavesaveUninitialized 的默认值都是 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。这也意味着如果您有一个商店与您的会话中间件相连,现在您的会话将存储在商店中。

  1. 如果您将 resave 设置为 true,那么对于每个请求,您的 session-cookie 每次都会被重置。参考:click here to read