NestJS+TypeORM:Connection类弃用后如何配置可访问的数据库实例
TypeORM 弃用 Connection 后的替代方案(DataSource)
没错,TypeORM 从 0.3.x 版本开始正式弃用了 Connection 类,官方推荐用 DataSource 作为替代方案,这也是当前创建和管理数据库实例的标准方式。下面是适配你需求的具体改造方案:
1. 改造 DatabaseService,用 DataSource 替代 Connection
直接将原来的 Connection 替换为 DataSource,并使用 NestJS 提供的 @InjectDataSource() 装饰器注入实例:
import { Injectable } from '@nestjs/common'; import { InjectDataSource } from '@nestjs/typeorm'; import { DataSource, Repository } from 'typeorm'; @Injectable() export class DatabaseService { // 注入 DataSource 实例 constructor(@InjectDataSource() public dataSource: DataSource) {} // 保持原有方法逻辑,只是从 dataSource 获取 Repository public getRepository<T>(entity: any): Repository<T> { return this.dataSource.getRepository(entity); } }
也可以直接注入 DataSource 类(无需装饰器),效果完全一致:
constructor(private dataSource: DataSource) {}
2. 调整 DatabaseModule 配置
你的原有 TypeOrmModule.forRootAsync 配置不需要大幅修改——NestJS 的 TypeORM 模块已经内部适配了 DataSource,只需确保依赖导入正确即可。另外建议统一使用 ConfigService 获取环境变量,避免混合 process.env:
import { Module } from '@nestjs/common'; import { TypeOrmModule } from '@nestjs/typeorm'; import { ConfigModule, ConfigService } from '@nestjs/config'; import { DatabaseService } from './database.service'; @Module({ imports: [ TypeOrmModule.forRootAsync({ imports: [ConfigModule], inject: [ConfigService], useFactory: async (configService: ConfigService) => ({ type: 'postgres', host: configService.get('DB_HOST'), port: +configService.get('DB_PORT'), username: configService.get('DB_USER'), password: configService.get('DB_PASSWORD'), database: configService.get('DB_NAME'), autoLoadEntities: true, synchronize: true, // 注意:生产环境必须关闭此选项,防止数据丢失 }), }), ], providers: [DatabaseService], exports: [DatabaseService], // 如果需要在其他模块复用 DatabaseService,必须导出 }) export class DatabaseModule {}
额外说明
- 多数据源支持:如果需要配置多个数据库,可以在
forRootAsync中添加name参数标识数据源,注入时用@InjectDataSource('数据源名称')指定实例。 - 核心功能兼容:
DataSource完全继承了原Connection的所有功能(如事务管理、查询运行器等),原有业务逻辑无需大幅修改。 - 生产环境注意:
synchronize: true会自动根据实体结构修改数据库表结构,仅适合开发/测试环境,生产环境请使用迁移脚本(typeorm migration:*命令)管理数据库变更。
内容的提问来源于stack exchange,提问作者Alberto Sánchez
相关产品推荐
相关产品推荐

