NestJS+TypeORM报错‘Connection "default" was not found’求排查
问题原因与解决办法
问题根源
- TypeORM连接未完成初始化就调用全局方法:
await NestFactory.create(AppModule)执行后,Nest会启动模块初始化流程,但TypeORM的数据库连接此时可能还未完全建立并注册到全局连接管理器中,直接调用getRepository(Session)自然找不到默认连接。 - 违背Nest依赖注入规范:全局
getRepository方法脱离了Nest的模块生命周期管理,无法确保依赖(数据库连接)已就绪,这不是Nest中获取Repository的正确方式。
解决办法
方法一:从Nest容器中获取Repository(快速修复)
修改main.ts,通过Nest的DI容器获取Repository,确保连接已初始化:
import { getRepositoryToken } from '@nestjs/typeorm'; // ...其他导入 const app = await NestFactory.create(AppModule); // 从Nest容器中获取Session仓库,确保连接已就绪 const sessionRepository = app.get(getRepositoryToken(Session)); app.useWebSocketAdapter(new WebsocketAdapter(app)); app.enableCors({ origin: 'http://localhost:5173', credentials: true }); app.use( session({ secret: process.env.SESSION_SECRET, resave: false, saveUninitialized: false, name: 'session_cookie_name', cookie: { maxAge: 1000 * 60 * 60 * 24, }, store: new TypeormStore().connect(sessionRepository), }), ); app.use(passport.initialize()); app.use(passport.session()); await app.listen(3000);
方法二:将中间件配置移到模块中(符合Nest最佳实践)
把session中间件的配置移到AppModule里,利用Nest的模块生命周期确保依赖就绪,同时更符合框架规范:
- 修改
AppModule.ts:
import { Module, NestModule, MiddlewareConsumer } from '@nestjs/common'; import { TypeOrmModule, getRepositoryToken, Repository } from '@nestjs/typeorm'; import { Inject } from '@nestjs/common'; import { Session } from './entities/session.entity'; // ...其他导入 @Module({ imports: [ AuthModule, UsersModule, ConfigModule.forRoot({ envFilePath: '.env.development', }), PassportModule.register({ session: true, }), TypeOrmModule.forRoot({ type: 'mysql', host: process.env.DB_HOST, port: parseInt(process.env.DB_PORT), username: process.env.DB_USERNAME, password: process.env.DB_PASSWORD, database: process.env.DB_NAME, entities: [User, Session], synchronize: true, logging: false, }), TypeOrmModule.forFeature([Session]), // 注册Session实体到模块 GatewayModule, ], controllers: [], providers: [], }) export class AppModule implements NestModule { constructor( @Inject(getRepositoryToken(Session)) private readonly sessionRepository: Repository<Session>, ) {} configure(consumer: MiddlewareConsumer) { consumer .apply( session({ secret: process.env.SESSION_SECRET, resave: false, saveUninitialized: false, name: 'session_cookie_name', cookie: { maxAge: 1000 * 60 * 60 * 24, }, store: new TypeormStore().connect(this.sessionRepository), }), passport.initialize(), passport.session(), ) .forRoutes('*'); // 对所有路由应用这些中间件 } }
- 简化
main.ts:
const app = await NestFactory.create(AppModule); app.useWebSocketAdapter(new WebsocketAdapter(app)); app.enableCors({ origin: 'http://localhost:5173', credentials: true }); await app.listen(3000);
内容的提问来源于stack exchange,提问作者NichuNaizam
相关产品推荐
相关产品推荐

