NestJS自定义UserRepository注入失败:findByIsMember方法不存在求助
问题:NestJS + TypeORM 自定义 Repository 注入失败导致方法不存在
在使用NestJS和TypeORM开发时,调用获取用户API触发如下错误:
TypeError: this.userRepository.findByIsMember is not a function
推测是自定义UserRepository未正确注入,以下是相关代码文件及报错堆栈信息,请求排查解决。
相关代码文件
1. user.repository.ts
import { Repository, EntityRepository } from 'typeorm'; import { User } from './user.entity'; @EntityRepository(User) export class UserRepository extends Repository<User> { async findByIsMember(isMember: boolean): Promise<User[]> { return this.createQueryBuilder('user') .where('user.is_member = :isMember', { isMember }) .getMany(); } }
2. user.service.ts
import { Injectable } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; import { UserRepository } from './user.repository'; import { User } from './user.entity'; @Injectable() export class UserService { constructor( @InjectRepository(UserRepository) private readonly userRepository: UserRepository, ) {} async getMembers(): Promise<User[]> { return this.userRepository.findByIsMember(true); // 报错触发位置 } }
3. user.module.ts
import { Module } from '@nestjs/common'; import { TypeOrmModule } from '@nestjs/typeorm'; import { UserService } from './user.service'; import { UserController } from './user.controller'; import { User } from './user.entity'; import { UserRepository } from './user.repository'; @Module({ imports: [TypeOrmModule.forFeature([User])], providers: [UserService], controllers: [UserController], }) export class UserModule {}
报错堆栈信息
TypeError: this.userRepository.findByIsMember is not a function at UserService.getMembers (/path/to/project/src/user/user.service.ts:12:35) at UserController.getMembers (/path/to/project/src/user/user.controller.ts:10:25) at /path/to/project/node_modules/@nestjs/core/router/router-execution-context.js:38:29 at processTicksAndRejections (node:internal/process/task_queues:96:5)
排查与解决步骤
1. 修正模块中Repository的注册逻辑
自定义Repository必须在TypeOrmModule.forFeature中明确注册,而非仅注册Entity。修改user.module.ts:
@Module({ imports: [TypeOrmModule.forFeature([UserRepository])], // 替换为自定义Repository providers: [UserService], controllers: [UserController], }) export class UserModule {}
2. 适配TypeORM v0.3.x+版本(若使用高版本)
TypeORM v0.3.x及以上已弃用@EntityRepository装饰器,需改用手动注入基础Repository的方式实现自定义逻辑:
修改user.repository.ts:
import { Repository } from 'typeorm'; import { Injectable } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; import { User } from './user.entity'; @Injectable() export class UserRepository { constructor( @InjectRepository(User) private readonly repository: Repository<User>, ) {} async findByIsMember(isMember: boolean): Promise<User[]> { return this.repository.createQueryBuilder('user') .where('user.is_member = :isMember', { isMember }) .getMany(); } }
修改user.module.ts:
@Module({ imports: [TypeOrmModule.forFeature([User])], providers: [UserService, UserRepository], // 手动注册自定义Repository为Provider controllers: [UserController], }) export class UserModule {}
修改user.service.ts注入方式:
@Injectable() export class UserService { constructor( private readonly userRepository: UserRepository, // 直接注入,无需@InjectRepository ) {} async getMembers(): Promise<User[]> { return this.userRepository.findByIsMember(true); } }
3. 校验注入类型匹配
确保user.service.ts中注入的类型是自定义的UserRepository,而非TypeORM默认的Repository<User>。若类型不匹配,NestJS会自动注入基础Repository实例,自然不存在自定义方法。
4. 清理缓存重启服务
修改模块配置后,可能存在NestJS缓存导致的注入未更新,执行命令重启服务:
npm run start:dev
验证方法
重启服务后调用目标API,若错误消失且能正确返回成员列表,说明注入问题已解决。
内容的提问来源于stack exchange,提问作者user15611884
相关产品推荐
相关产品推荐

