Я недавно преобразовал свой 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();
}
}