使用express-session+connect-redis存储会话报错:TypeError: this.client.set不是函数
问题原因
你直接把redisService()传给了StoreRedis的client参数,但redisService是async函数,返回的是Promise对象,不是实际的Redis客户端实例。connect-redis调用this.client.set时,实际调用的是Promise的set方法,自然不存在,所以触发报错。
解决方案
修改app.js的代码,先等待redisService返回实际的客户端实例,再传入StoreRedis:
import express from "express"; import http from "http"; import https from "https"; // 补充导入https,原代码中使用但未声明 import session from "express-session"; import connectRedis from "connect-redis"; import redisService from "./redis-service.js"; // 确保文件路径正确 const app = express(); const StoreRedis = connectRedis(session); // 用async函数包裹初始化逻辑,等待Redis客户端实例就绪 (async () => { const redisClient = await redisService(); sessionConfig.setStorage(new StoreRedis({ client: redisClient })); app.use(session(sessionConfig.getConfig())); app.use("/", router); const server = appConfig.SECURE ? https.createServer({}, app) : http.createServer(app); server.listen(appConfig.GAME_SERVICE_PORT, appConfig.SERVER_HOST, () => { const protocol = appConfig.SECURE ? "https" : "http"; console.log( `Server started ${protocol}://${appConfig.SERVER_HOST}:${appConfig.GAME_SERVICE_PORT}` ); }); })();
额外检查点
- 确认
connect-redis版本适配Redis v4:如果使用connect-redis@7+,它原生支持Redis v4客户端,你开启的legacyMode也能兼容,但需确保依赖安装完整。 - 检查
sessionConfig.getConfig()返回的配置是否包含secret参数,express-session必须配置该参数才能正常运行。
内容的提问来源于stack exchange,提问作者Oli Soproni B.
相关产品推荐
相关产品推荐

