gpt4 book ai didi

javascript - 如何关闭 nestjs 服务中的数据库连接?

转载 作者:行者123 更新时间:2023-12-05 02:05:12 29 4
gpt4 key购买 nike

在我的数据库模块中,我正在创建到我的数据库的连接。使用此设置我确实得到了错误

工作进程无法正常退出,已被强制退出。这可能是由于拆卸不当导致测试泄漏造成的。尝试使用 --runInBand --detectOpenHandles 运行以查找泄漏。

在我的端到端测试中。

我想我必须关闭连接。但是如何在数据库模块的 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()
}
}

最佳答案

打开的数据库连接是导致此问题的常见原因。模块需要自行清理,这尤其适用于测试模块可以多次实例化的情况。

client 引用需要保留以进行清理。这可以通过单类服务来完成:

@Injectable()
class DatabaseConnection {
async onModuleInit() {
// ...same as DATABASE_CONNECTION factory
this.client = client;
this.db = client.db(database);
}
async onModuleDestroy() {
await this.client.close()
}
}

或者有两个工厂提供者,其中一个保持对client的引用:

@Module({
providers: [
{
provide: 'DATABASE_CLIENT',
useFactory: () => ({ client: null })
},
{
provide: 'DATABASE_CONNECTION',
inject: ['DATABASE_CLIENT'],
useFactory: async (dbClient) => {
...
dbClient.client = client
const db = client.db(database)
return db;
}
}
]
...
})
export class DatabaseModule {
constructor(@Inject('DATABASE_CLIENT') private dbClient) {}

async onModuleDestroy() {
await this.dbClient.client.close()
}
}

关于javascript - 如何关闭 nestjs 服务中的数据库连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63753467/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com