Nodejs 如何express 的session 自动清空的问题

Nodejs 如何express 的session 自动清空的问题

app.use(express.cookieParser(‘keyboard cat’)); app.use(express.session({ secret: “keyboard cat”, cookie: {secure: true, maxAge:null} }) );

为什么过一段时间,session里的值就被清空了, 看connect的API 说maxAge:null时 session默认是浏览器的session,只有关闭浏览器才会清空。 可是我的还是一会就被清空了。 希望大神帮解决下


3 回复

Node.js 中如何处理 Express Session 自动清空的问题

在使用 Express 框架时,有时会遇到 session 数据自动清空的问题。根据你的描述,你已经设置了 maxAgenull,这意味着 session 应该在浏览器关闭后才被清除。然而,如果你发现 session 在较短时间内就被清空了,可能是因为其他配置或环境问题。

解决方案

  1. 确保正确配置 cookie 和 session

    首先,确保你的 cookie 和 session 配置正确。你可以使用 express-session 包来管理 session,而不是使用旧的 express 包中的 session 方法。

    const express = require('express');
    const session = require('express-session');
    
    const app = express();
    
    // 使用 express-session 中间件
    app.use(session({
      secret: 'keyboard cat',
      resave: false,
      saveUninitialized: true,
      cookie: {
        secure: false, // 如果使用 HTTPS,则设置为 true
        maxAge: null // 关闭浏览器时失效
      }
    }));
    
  2. 检查存储后端

    默认情况下,Express 使用内存存储 session 数据。这在开发环境中没问题,但在生产环境中,建议使用持久化存储,如 connect-mongoconnect-redis

    const MongoStore = require('connect-mongo')(session);
    
    app.use(session({
      secret: 'keyboard cat',
      store: new MongoStore({ url: 'mongodb://localhost:27017/session-store' }),
      resave: false,
      saveUninitialized: true,
      cookie: {
        secure: false,
        maxAge: null
      }
    }));
    
  3. 确保客户端支持

    确保客户端浏览器支持 session cookie。如果浏览器禁用了 cookie,session 也会失效。

  4. 调试日志

    添加一些日志来帮助你理解 session 的生命周期:

    app.use((req, res, next) => {
      console.log('Session:', req.session);
      next();
    });
    

通过以上步骤,你应该能够解决 session 自动清空的问题。确保检查所有相关的配置,并确保使用持久化的存储解决方案以避免数据丢失。


我如果想把 session 存进 mysql 如何实现, 存进去后怎么取出来呢?

在Express中使用express-session中间件管理Session时,默认情况下,Session会在一定时间后失效。如果希望Session在浏览器关闭后才清空,你需要确保配置正确,并且理解maxAge的作用。

解释

  1. Cookie的maxAge属性:设置为null意味着Session Cookie是临时的(浏览器会话级),即当浏览器关闭时,该Cookie会被删除。
  2. 服务器端Session存储的有效期:如果你希望Session在服务器端也保持更长时间,需要单独设置服务器端Session的有效期。

示例代码

const express = require('express');
const session = require('express-session');

const app = express();

// 使用express-session中间件
app.use(session({
    secret: 'keyboard cat', // 用于签名的密钥
    resave: false,          // 强制保存session即使它并未变化
    saveUninitialized: true,// 强制创建一个session,即使用户未登录
    cookie: {
        secure: false,      // 如果为true,则只能通过HTTPS传输
        maxAge: null        // 浏览器会话级别
    },
    rolling: true,          // 每次请求都会重设cookie的有效期
    store: new session.MemoryStore(), // 使用内存存储Session数据
    genid: function(req) {
        return require('uuid').v4() // 为每个会话生成唯一的ID
    }
}));

// 设置Session在服务器端的有效期
app.use((req, res, next) => {
    req.session.cookie.expires = new Date(Date.now() + 60 * 60 * 1000); // 设置1小时有效期
    next();
});

app.get('/', (req, res) => {
    if (!req.session.views) {
        req.session.views = 0;
    }
    req.session.views++;
    res.send(`Views: ${req.session.views}`);
});

app.listen(3000, () => console.log('Server running on port 3000'));

关键点说明

  • maxAge: null:确保Session Cookie在浏览器关闭时失效。
  • 服务器端Session有效期:通过自定义中间件设置req.session.cookie.expires来控制Session在服务器端的有效期。
  • rolling: true:每次请求都重设Cookie的有效期,这样即使浏览器不关闭,Session也能保持活跃状态。

注意事项

  • 如果使用secure: true,必须确保应用通过HTTPS提供服务。
  • MemoryStore仅适用于开发环境,生产环境中推荐使用持久化存储如connect-mongoconnect-redis

以上配置应该能解决你遇到的Session自动清空的问题。

回到顶部