You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 09:24:42