import { Global, Inject, Module, OnModuleDestroy } from '@nestjs/common'; import { createApplicationDatabase, type Database } from '@atlas/database'; import { APP_CONFIG, type AppConfig } from '../config/app-config.module.js'; export const DATABASE = Symbol('DATABASE'); @Global() @Module({ providers: [ { provide: DATABASE, inject: [APP_CONFIG], // 业务代码只能拿到受限应用连接,迁移连接串绝不注入 API 容器。 useFactory: (config: AppConfig): Database => createApplicationDatabase(config.DATABASE_URL), }, ], exports: [DATABASE], }) export class DatabaseModule implements OnModuleDestroy { public constructor(@Inject(DATABASE) private readonly database: Database) {} public async onModuleDestroy() { // Nest 关闭时主动释放连接池,避免测试和热重启遗留连接。 await this.database.close(); } }