开发实时聊天应用时,connect-redis出现require(...) is not a function错误
解决express-session搭配connect-redis时的
require(...) is not a function错误 问题原因
你遇到的require(...) is not a function错误,核心原因是connect-redis版本迭代后导出方式发生了变化。v6及以上版本不再默认导出可直接调用的函数,而是需要通过解构或.default属性获取RedisStore构造函数。
解决方案
1. 调整connect-redis的导入语句
根据你使用的Redis客户端(ioredis或官方redis包),修改导入代码:
如果你用ioredis:
const session = require("express-session"); const Redis = require("ioredis"); // 从connect-redis的default导出中获取RedisStore const RedisStore = require("connect-redis").default;
如果你用官方redis包:
const session = require("express-session"); const { createClient } = require("redis"); const RedisStore = require("connect-redis").default;
2. 修正Redis客户端初始化(针对官方redis包)
官方redis包v4+需要显式调用connect()建立连接:
const redisClient = createClient({ // 可选:添加Redis连接配置,如url、密码等 // url: "redis://localhost:6379" }); // 处理连接错误 redisClient.connect().catch(console.error);
3. 优化express-session配置细节
注意几个容易踩坑的配置项:
cookie.secure应该是布尔值,而非字符串,避免解析异常- 推荐用
maxAge替代expires,更直观控制会话有效期
app.use(session({ secret: process.env.COOKIE_SECRET, credentials: true, name: "$id", store: new RedisStore({ client: redisClient }), resave: false, saveUninitialized: false, cookie: { secure: process.env.ENVIRONMENT === "production", // 生产环境设为true,开发环境默认false httpOnly: true, maxAge: 1000 * 60 * 60 * 24 * 7, // 7天有效期 sameSite: process.env.ENVIRONMENT === "production" ? "none" : "lax", } }));
验证步骤
- 运行
npm list connect-redis确认版本是否为v6+ - 重启服务后测试登录态是否能在页面刷新后保持
- 检查Redis客户端是否正常连接(可通过Redis CLI执行
KEYS *查看会话键值)
内容的提问来源于stack exchange,提问作者Nabil Ahmed
相关产品推荐
相关产品推荐

