首页 > 解决方案 > 如何在 NestJS 中拆除 MikroOrm

问题描述

我最近将我的 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();
  }
}


标签: nestjsmikro-orm

解决方案


正如问题中所讨论的,我会使用nestjs/typeorm 的使用方式,所以使用onApplicationShutdown钩子。

还在这里为可能的未来读者链接问题:

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


推荐阅读