如何在 NestJS 中拆除 MikroOrm

How to tear down MikroOrm in NestJS

我最近将我的 AppModule 转换为动态模块,以便我能够根据上下文(E2E 测试等)为 MikroOrm 提供不同的配置,它目前看起来像这样:

@Module({
  imports: [
    MikroOrmModule.forFeature({
      entities: [Todo],
    }),
  ],
  providers: [TodoService],
  controllers: [AppController, TodosController],
})
export class AppModule {
  static register(options?: {
    mikroOrmOptions?: MikroOrmModuleOptions;
  }): DynamicModule {
    return {
      module: AppModule,
      imports: [
        MikroOrmModule.forRoot({
          entities: [Todo],
          type: 'postgresql',
          host: process.env.DB_HOST,
          port: process.env.DB_PORT ? parseInt(process.env.DB_PORT) : 5432,
          user: process.env.DB_USER,
          password: process.env.DB_PASS,
          dbName: process.env.DB_DB,

          ...options?.mikroOrmOptions,
        }),
      ],
    };
  }
}

现在我试图通过与数据库断开连接来确保应用程序正常关闭,但不确定在这种情况下将生命周期挂钩放在何处。似乎不可能有一个带有生命周期挂钩的动态模块,所以我正在考虑开发一个单独的提供程序来注入 orm 并在其上编写挂钩。

正确的做法是什么?谢谢

编辑:

我想到了以下解决方案。如果有人指出这是否是最好的方法,将不胜感激:

import { MikroORM } from 'mikro-orm';
...

@Module({
  imports: [
    MikroOrmModule.forFeature({
      entities: [Todo],
    }),
  ],
  providers: [TodoService],
  controllers: [AppController, TodosController],
})
export class AppModule implements OnModuleDestroy {
  static register(options?: {
    mikroOrmOptions?: MikroOrmModuleOptions;
  }): DynamicModule {
    return {
      module: AppModule,
      imports: [
        MikroOrmModule.forRoot({
          entities: [Todo],

          type: 'postgresql',
          host: process.env.DB_HOST,
          port: process.env.DB_PORT ? parseInt(process.env.DB_PORT) : 5432,
          user: process.env.DB_USER,
          password: process.env.DB_PASS,
          dbName: process.env.DB_DB,

          ...options?.mikroOrmOptions,
        }),
      ],
    };
  }

  constructor(private orm: MikroORM) {}

  async onModuleDestroy(): Promise<void> {
    await this.orm.close();
  }
}


正如问题中所讨论的那样,我会采用 nestjs/typeorm 使用的方式,因此使用 onApplicationShutdown 钩子。

同时在此处为可能的未来读者链接问题:

https://github.com/dario1985/nestjs-mikro-orm/issues/10