NestJS调用TypeORM自定义Repository函数提示未定义如何解决
问题根因
typeorm@0.3.x版本存在不兼容更新,0.2版本常用的@EntityRepository()装饰器标记自定义仓库的写法已被完全移除。你当前使用的@nestjs/typeorm@^8.1.4 + typeorm@^0.3.7 + NestJS 8.2.8的技术栈下,如果沿用旧版自定义仓库写法,注入到Service中的会是无自定义方法的原生Repository实例,调用自定义方法时必然抛出未定义错误,该问题和是否添加@InjectRepository(UserRepository)装饰器无直接关联。
修复步骤
1. 重写UserRepository实现
移除所有旧版@EntityRepository()相关装饰器,通过构造函数注入DataSource初始化父类Repository,示例代码如下:
import { Injectable } from '@nestjs/common'; import { DataSource, Repository } from 'typeorm'; import { User } from './entities/user.entity'; import { CreateUserDto } from './dto/create-user.dto'; @Injectable() export class UserRepository extends Repository<User> { constructor(private dataSource: DataSource) { super(User, dataSource.createEntityManager()); } // 你的自定义signup方法逻辑 async signup(createUserDto: CreateUserDto) { const user = this.create(createUserDto); return this.save(user); } }
2. 修正Module层提供者配置
TypeOrmModule.forFeature()数组中仅传入实体类,不要传入自定义Repository;自定义Repository直接声明在providers数组中即可:
import { Module } from '@nestjs/common'; import { TypeOrmModule } from '@nestjs/typeorm'; import { User } from './entities/user.entity'; import { UserRepository } from './user.repository'; import { UserService } from './user.service'; import { UserController } from './user.controller'; @Module({ imports: [TypeOrmModule.forFeature([User])], // 仅注册实体 controllers: [UserController], providers: [UserService, UserRepository], // 自定义仓库直接声明为提供者 exports: [UserRepository], }) export class UserModule {}
3. 修正Service层注入逻辑
移除自定义Repository注入时多余的@InjectRepository()装饰器,直接通过构造函数注入即可:
import { Injectable } from '@nestjs/common'; import { CreateUserDto } from './dto/create-user.dto'; import { UserRepository } from './user.repository'; @Injectable() export class UserService { constructor(private readonly userRepository: UserRepository) {} async signup(createUserDto: CreateUserDto) { // 此时调用自定义方法不会再报未定义错误 return this.userRepository.signup(createUserDto); } }
避坑提示
- 不要将自定义Repository类传入
TypeOrmModule.forFeature()数组,该参数仅接收Entity实体类,传错会导致注入原生Repository实例 - 检查根模块TypeORM连接配置,确保
User实体已被加入entities配置项,且数据库连接正常 - 全局搜索项目中残留的
typeorm0.2版本API调用,避免版本混用导致的其他异常
内容的提问来源于stack exchange,提问作者Tạ Bá Trung
相关产品推荐
相关产品推荐

