Как разрушить MikroOrm в NestJS - PullRequest
1 голос
/ 27 мая 2020

Я недавно преобразовал свой AppModule в модуль Dynami c, чтобы я мог предоставлять MikroOrm разные конфигурации в зависимости от контекста (тесты E2E и др. c), и в настоящее время он выглядит так:

@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,
        }),
      ],
    };
  }
}

Теперь я пытаюсь обеспечить плавное завершение работы приложения, отключившись от базы данных, но не уверен, где разместить крючок жизненного цикла в этом случае. Кажется невозможным иметь модуль Dynami c с хуками жизненного цикла, поэтому я подумываю о разработке отдельного провайдера, который внедряет орм и напишет на него крючок.

Что был бы правильный подход? Спасибо.

Edit:

Я придумал следующее решение. Был бы признателен, если бы кто-нибудь указал, лучший ли это способ:

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();
  }
}


1 Ответ

1 голос
/ 27 мая 2020

Как обсуждалось в проблемах, я бы использовал go с тем, как использует nestjs / typeorm, поэтому использовал onApplicationShutdown hook.

Также ссылку на проблему здесь для возможных будущих читателей:

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

...