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

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的模块生命周期确保依赖就绪,同时更符合框架规范:

  1. 修改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('*'); // 对所有路由应用这些中间件
  }
}
  1. 简化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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 16:30:57