使用@nestjs/typeorm v9.0.1与typeorm v0.3.9时createEntityManager报错
解决TypeORM 0.3.x + NestJS TypeORM 9.x中
dataSource.createEntityManager is not a function及withRepository调用异常 问题根源
TypeORM 0.3.x版本对EntityManager、DataSource的API进行了大幅重构:
- 彻底移除了
createEntityManager方法,原功能可通过dataSource.manager直接获取EntityManager实现; - 自定义Repository的初始化逻辑变更,不再需要手动创建EntityManager实例;
- 事务上下文内使用
withRepository时,需传入Repository类而非已实例化的对象,否则会出现上下文不匹配。
具体修复步骤
1. 修复自定义Repository的构造函数
原BarRepository中调用了已被移除的createEntityManager,替换为dataSource.manager即可:
import { Injectable } from '@nestjs/common'; import { Repository, DataSource } from 'typeorm'; import { BarEntity } from '../entities/bar.entity'; @Injectable() export class BarRepository extends Repository<BarEntity> { constructor(dataSource: DataSource) { // 改用dataSource.manager替代已移除的createEntityManager super(BarEntity, dataSource.manager); } }
如果需要基于NestJS自动注入的基础Repository扩展,也可以用以下更简洁的方式:
import { Injectable } from '@nestjs/common'; import { Repository } from 'typeorm'; import { InjectRepository } from '@nestjs/typeorm'; import { BarEntity } from '../entities/bar.entity'; @Injectable() export class BarRepository extends Repository<BarEntity> { constructor( @InjectRepository(BarEntity) private readonly baseRepository: Repository<BarEntity>, ) { super(baseRepository.target, baseRepository.manager, baseRepository.queryRunner); } }
2. 修复事务中withRepository的调用方式
事务回调内的manager需要创建绑定当前事务上下文的Repository实例,因此要传入Repository类而非已注入的实例:
import { Injectable } from "@nestjs/common"; import { DataSource } from "typeorm"; import { BarRepository } from "./repositories/bar.repository"; @Injectable() export class BarService { constructor( private readonly dataSource: DataSource ) {} async foo() { await this.dataSource.transaction(async (manager) => { // 传入BarRepository类,让事务manager创建对应上下文的实例 const barRepository = manager.withRepository(BarRepository); // 执行数据库操作,例如:await barRepository.save(...) return; }); } }
若仅需操作实体基础CRUD,也可直接通过实体类获取Repository:
const barRepository = manager.getRepository(BarEntity);
3. 确认Module配置正确性
确保TypeOrmModule.forFeature包含目标实体,自定义Repository已加入providers列表:
import { Module } from '@nestjs/common'; import { TypeOrmModule } from '@nestjs/typeorm'; import { BarEntity } from './entities/bar.entity'; import { BarService } from './services/bar.service'; import { BarRepository } from './repositories/bar.repository'; @Module({ imports: [TypeOrmModule.forFeature([BarEntity])], providers: [BarService, BarRepository], exports: [BarService], }) export class BarModule {}
补充说明
TypeORM 0.3.x相较于0.2.x有大量API变更,建议参考官方迁移文档梳理所有适配点。
内容的提问来源于stack exchange,提问作者user18169254
相关产品推荐
相关产品推荐

