如何在 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
钩子。
同时在此处为可能的未来读者链接问题:
我最近将我的 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
钩子。
同时在此处为可能的未来读者链接问题: