ES6环境下集成connect-redis与express-session报错求助
解决connect-redis与express-session集成时的TypeError问题
问题场景
在ES6项目中集成connect-redis与express-session,代码实现如下:
import session from 'express-session'; import connectRedis from 'connect-redis'; import { createClient } from 'redis'; const app = express(); async function startServer() { const redisURL = 'redis://localhost:6379'; const redisClient = createClient(); const RedisStore = connectRedis(session); await redisClient.connect({ url: redisURL }); const store = new RedisStore({ redisClient }); app.use(session({ store: store , secret: process.env.SESSION_SECRET, resave: false, saveUninitialized: false, cookie: { httpOnly: true, path: '/', sameSite: 'strict', expires: new Date(Date.now() + 30 * 24 * 60 * 60 * 1000) } })); }
报错信息
D:\AI Projects\Hplayer - Copy\server\server.js:33
RedisStore = (0, _connectRedis["default"])(_expressSession["default"]);
^
TypeError: Class constructor RedisStore cannot be invoked without 'new'
解决方案
该错误源于connect-redis v7+版本的API变更,旧版本通过connectRedis(session)生成Store类的方式已被废弃,需调整为以下写法:
import session from 'express-session'; // 直接导入RedisStore类 import { RedisStore } from 'connect-redis'; import { createClient } from 'redis'; const app = express(); async function startServer() { const redisURL = 'redis://localhost:6379'; // 初始化redisClient时直接传入URL参数 const redisClient = createClient({ url: redisURL }); await redisClient.connect(); app.use(session({ // 实例化RedisStore时,参数键名改为client store: new RedisStore({ client: redisClient }), secret: process.env.SESSION_SECRET, resave: false, saveUninitialized: false, cookie: { httpOnly: true, path: '/', sameSite: 'strict', expires: new Date(Date.now() + 30 * 24 * 60 * 60 * 1000) } })); }
关键修改点
- 直接从
connect-redis导入RedisStore类,无需再通过connectRedis(session)生成 - 实例化
RedisStore时,配置参数的键名从redisClient改为client - 创建redis客户端时,直接将URL传入
createClient,无需在connect方法中重复传入
内容的提问来源于stack exchange,提问作者Hetnon Freitas
相关产品推荐
相关产品推荐

