Nodejs connect-redis怎么设置过期时间
Nodejs connect-redis怎么设置过期时间
使用redis,过期时间怎么处理,我希望即使服务器重启,用户还能保持登录。 另一个问题是,为什么我的res.session总是undefined呢?
2 回复
Node.js Connect-Redis 设置过期时间
问题描述
- 使用 Redis 存储会话时,如何设置会话的过期时间?
- 在 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-session
和connect-redis
中间件已按顺序正确加载。 - 请求路径或方法不正确:检查你的路由是否与会话创建逻辑匹配。
- 会话存储配置错误:确保
RedisStore
正确配置并连接到 Redis。
确保你的应用代码中包含上述会话配置,并且正确加载了所有中间件。
要在使用 connect-redis
作为会话存储时设置过期时间,你可以通过配置 Redis 存储选项来实现。另外,关于 res.session
为 undefined
的问题,通常是因为会话没有正确地加载或请求对象中没有正确挂载会话。
设置过期时间
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.session
为 undefined
的问题
确保你的中间件顺序正确,并且已经正确加载了会话中间件。以下是一个正确的顺序示例:
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
在路由处理函数中可用。