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
相关产品推荐
相关产品推荐

