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

NestJS Typescript集成express-mysql-session会话存储报错如何解决

解决方案

问题原因

核心是express-mysql-session的CommonJS导出规范和TypeScript ES模块导入规则不兼容,当前导入方式拿到的不是正确的工厂函数,所以运行时会抛出调用失败的错误。

修复方法

调整导入和初始化逻辑即可,两种兼容写法可选:

写法1:适配ES模块导入(推荐)

import session from "express-session";
// 调整导入方式
import * as MySQLSessionFactory from "express-mysql-session";
// 初始化构造函数
const MySQLStore = (MySQLSessionFactory as unknown as (session: typeof session) => any)(session);

替换原来的存储初始化代码,删除原有const store = MySQLStore(session);行,直接初始化存储实例:

const sessionStore = new MySQLStore(options);

写法2:兼容官方require写法(解决编译报错)

如果要使用官方给出的require示例写法,只需要在代码顶部增加declare声明解决TS编译报错即可:

// 顶部添加声明,兼容require语法
declare var require: any;
import session from "express-session";
const MySQLStore = require('express-mysql-session')(session);

后续初始化逻辑和官方示例保持一致即可。

完整修复后代码示例

import { NestFactory } from "@nestjs/core";
import { AppModule } from "./app.module";
import { env } from "./common/env";
import session from "express-session";
import * as MySQLSessionFactory from "express-mysql-session";

const MySQLStore = (MySQLSessionFactory as unknown as (session: typeof session) => any)(session);

async function bootstrap() {
  const app = await NestFactory.create(AppModule, {
    cors: { credentials: env.ENABLE_CORS, origin: env.CLIENT_HOST },
  });

  //session store配置
  const options = {
    host: "db",
    port: 3306,
    user: env.DB_USER,
    password: env.DB_PASSWD,
    database: env.DATABASE,
    checkExpirationInterval: 1000 * 60 * 60 * 2,
    expiration: 1000 * 60 * 60 * 24,
  };

  const sessionStore = new MySQLStore(options);

  app.use(
    session({
      secret: env.COOKIE_SECRET,
      store: sessionStore,
      resave: false,
      saveUninitialized: false,
      cookie: {
        httpOnly: true,
        maxAge: 1000 * 60 * 60 * 24,
      },
    }),
  );

  await app.listen(env.PORT_BACKEND || 8080);
}
bootstrap();

替代包推荐

如果希望适配NestJS生态,减少兼容性问题,可以选择以下替代方案:

  • connect-typeorm:如果项目已经使用TypeORM操作MySQL,该包可以直接复用已有的数据库连接配置,不需要单独配置会话存储的连接参数,和NestJS集成度更高
  • nestjs-session:封装好的NestJS会话模块,支持多种存储适配器,配置更符合NestJS的模块注入风格

内容的提问来源于stack exchange,提问作者FluffyTanuki

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 16:48:02