nestjs - 如何在 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();
}
}
解决方案
正如问题中所讨论的,我会使用nestjs/typeorm 的使用方式,所以使用onApplicationShutdown
钩子。
还在这里为可能的未来读者链接问题:
推荐阅读
- swagger-codegen - 在 DTO 类中使用 @JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY) 后将所有值设为 NULL
- amazon-web-services - 从 Cloudwatch 触发 Lambda 函数 - Json 文件
- java - 当我使用 PsiAugmentProvider 添加一些像 Lombok 这样的方法时捕获 ArrayStoreException
- linux - 为什么 Linux shell 脚本读取数组命令会提供比必要更多的元素?
- r - 套索回归 R - X Fold1:内部:...:找不到对象“eval_safely”
- python - 绘图在 Jupyter 中不可见
- android - 如何安装使用我创建的另一个 android 应用程序 (Android Studio) 创建的 android 应用程序?
- arrays - 指向数组和二维数组的指针
- go - go install c 共享输出路径
- python - 如何使用 QSqlTableModel 在可编辑的 QTableView 中将值设置为 NULL