【发布时间】:2020-12-24 10:51:30
【问题描述】:
在我的数据库模块中,我正在创建与我的数据库的连接。有了这个设置,我确实得到了错误
工作进程未能正常退出,已被强制退出。这可能是由于不正确的拆卸导致测试泄漏造成的。尝试使用 --runInBand --detectOpenHandles 运行以查找泄漏。
在我的 e2e 测试中。
我想我必须关闭连接。但是如何在我的数据库模块中的onModuleDestroy() 中运行client.close?
database.module.ts
import { Module } from '@nestjs/common'
import { MongoClient, Db, Logger } from 'mongodb'
@Module({
providers: [
{
provide: 'DATABASE_CONNECTION',
useFactory: async (): Promise<Db> => {
const mongo = 'mongodb://localhost:27017'
const database = 'testing'
try {
Logger.setLevel('debug')
const client = await MongoClient.connect(mongo, {
useNewUrlParser: true,
useUnifiedTopology: true,
});
const db = client.db(database)
return db
} catch (error) {
throw error
}
}
},
{
provide: 'DATABASE_CLIENT',
useFactory: () => true // how do I get client of the above provider?
}
],
exports: ['DATABASE_CONNECTION', 'DATABASE_CLIENT']
})
export class DatabaseModule {
constructor(
@Inject('DATABASE_CLIENT')
private client: Db
) {}
async onModuleDestroy() {
console.log(this.client);
// await this.client.close()
}
}
【问题讨论】:
-
很可能是的,这就是问题所在。在钩子中进行清理,docs.nestjs.com/fundamentals/lifecycle-events。我猜是 onModuleDestroy。
-
@EstusFlask 但是当数据库模块返回
db而不是client时,我该如何关闭客户端?请查看有关服务代码的更新帖子。 -
这需要在数据库服务或模块中完成,而不是在消费者中,模块有责任自行清理。是的,您需要为此保留对
client的引用。可能有一个单独的提供商{ provide: 'DATABASE_CLIENT' useFactory: () => ({ client: null }) }。将其注入 DATABASE_CONNECTION 以分配客户端属性,并注入 DatabaseModule 以在 onModuleDestroy 中访问它。我不确定在 Nest 中执行此操作的最佳方法是什么,如果 db 服务是一个类会更容易。 -
注入到 DATABASE_CONNECTION 是什么意思?您能否将 db 服务作为一个类发布一个示例?
-
我的意思是使用DI将客户端服务注入连接工厂。我发布了代码。我无法确认它是否可行,但我希望它或多或少会以这种方式完成。
标签: javascript testing jestjs nestjs