You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 18:35:27