Nodejs connect-redis怎么设置过期时间

Nodejs connect-redis怎么设置过期时间

使用redis,过期时间怎么处理,我希望即使服务器重启,用户还能保持登录。 另一个问题是,为什么我的res.session总是undefined呢?

2 回复

Node.js Connect-Redis 设置过期时间

问题描述

  1. 使用 Redis 存储会话时,如何设置会话的过期时间?
  2. 在 Node.js 应用中,为什么 req.session 总是 undefined

解决方案

1. 设置会话过期时间

使用 connect-redis 作为会话存储引擎时,可以通过配置项来设置会话的过期时间。默认情况下,connect-redis 会在 Redis 中为每个会话设置一个过期时间。

首先确保你已经安装了必要的依赖:

npm install express session-file-store connect-redis redis

然后,你可以这样配置会话存储:

const express = require('express');
const session = require('express-session');
const RedisStore = require('connect-redis')(session);
const redis = require('redis');

const app = express();

// 创建 Redis 客户端
const redisClient = redis.createClient({
    host: 'localhost',
    port: 6379,
});

app.use(session({
    store: new RedisStore({ client: redisClient }),
    secret: 'your_secret_key', // 用于加密会话 cookie 的密钥
    resave: false,             // 强制会话保存到存储
    saveUninitialized: false,  // 强制未初始化的会话保存
    cookie: { 
        maxAge: 24 * 60 * 60 * 1000 // 设置会话过期时间为 24 小时(毫秒)
    }
}));

// 示例路由
app.get('/', (req, res) => {
    if (!req.session.views) {
        req.session.views = 0;
    } else {
        req.session.views += 1;
    }

    res.send(`You have viewed this page ${req.session.views} times.`);
});

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

在这个例子中,我们通过 cookie.maxAge 设置了会话的过期时间。maxAge 是以毫秒为单位的过期时间,这里设置为 24 小时。

2. 为什么 req.session 总是 undefined

如果 req.session 始终是 undefined,可能是由于以下原因:

  • 会话中间件未正确加载:确保 express-sessionconnect-redis 中间件已按顺序正确加载。
  • 请求路径或方法不正确:检查你的路由是否与会话创建逻辑匹配。
  • 会话存储配置错误:确保 RedisStore 正确配置并连接到 Redis。

确保你的应用代码中包含上述会话配置,并且正确加载了所有中间件。


要在使用 connect-redis 作为会话存储时设置过期时间,你可以通过配置 Redis 存储选项来实现。另外,关于 res.sessionundefined 的问题,通常是因为会话没有正确地加载或请求对象中没有正确挂载会话。

设置过期时间

const session = require('express-session');
const RedisStore = require('connect-redis')(session);

app.use(session({
    store: new RedisStore({
        // 设置Redis客户端
        client: redisClient,
        // 设置默认过期时间为1天(单位:秒)
        ttl: 60 * 60 * 24,
    }),
    secret: 'your-secret-key',
    resave: false,
    saveUninitialized: false,
}));

在上述代码中,ttl 参数用于设置会话的过期时间。如果希望为每个会话单独设置过期时间,可以在创建会话时传递一个选项:

req.session.cookie.maxAge = 60 * 60 * 1000; // 设置会话过期时间为1小时(单位:毫秒)

解决 res.sessionundefined 的问题

确保你的中间件顺序正确,并且已经正确加载了会话中间件。以下是一个正确的顺序示例:

const express = require('express');
const session = require('express-session');
const RedisStore = require('connect-redis')(session);
const app = express();

app.use(session({
    store: new RedisStore({ client: redisClient }),
    secret: 'your-secret-key',
    resave: false,
    saveUninitialized: false,
}));

app.get('/', (req, res) => {
    req.session.views = (req.session.views || 0) + 1;
    res.send(`You visited this page ${req.session.views} times`);
});

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

在这个例子中,我们确保了 express-session 中间件在路由处理之前被正确加载。这样可以保证 req.session 在路由处理函数中可用。

回到顶部