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

TypeORM中@EntityRepository弃用后,我的自定义仓库实现是否最优?

问题:TypeORM自定义仓库实现是否最优?

TypeORM的@EntityRepository(User)已被弃用,我自行编写了一段可运行的自定义仓库代码,但不确定是否存在冗余、低效或其他问题,想确认这是不是最优实现:

import { Repository } from 'typeorm';
import { User } from '../entities/user.entity';
import { UnauthorizedException } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';

export class UserRepository extends Repository<User> {
  
  @InjectRepository(User)
  userRepository: Repository<User>;

  async findByCodeOrEmail(userCredentials: string): Promise<User | undefined> {
    try {
      const user = await this.userRepository.findOne({
        where: [
          { code: userCredentials },
          { email: userCredentials }
        ]
      });
      return user;
    } catch (error) {
      console.error('Error in UserRepository:', error);
      throw new UnauthorizedException('Error con credenciales');
    }
  }
}

回答

你的代码存在明显冗余,核心问题在于重复依赖了Repository实例:

  1. 无需额外注入Repository:UserRepository已经继承了Repository<User>,此时类本身就继承了父类的所有方法(包括findOne),完全没必要再通过@InjectRepository(User)注入一个独立的userRepository实例,这会造成不必要的实例创建,属于冗余设计。

  2. 方法可直接简化:直接使用this调用父类方法即可完成逻辑,不需要依赖注入的实例。

优化后的代码

import { Repository } from 'typeorm';
import { User } from '../entities/user.entity';
import { UnauthorizedException } from '@nestjs/common';

export class UserRepository extends Repository<User> {
  async findByCodeOrEmail(userCredentials: string): Promise<User | undefined> {
    try {
      return this.findOne({
        where: [
          { code: userCredentials },
          { email: userCredentials }
        ]
      });
    } catch (error) {
      console.error('Error in UserRepository:', error);
      throw new UnauthorizedException('Error con credenciales');
    }
  }
}

额外注意事项

  • NestJS中正确注册自定义仓库:由于@EntityRepository被弃用,需要在模块中手动注册自定义仓库,示例如下:

    import { Module } from '@nestjs/common';
    import { TypeOrmModule, getRepositoryToken } from '@nestjs/typeorm';
    import { User } from './entities/user.entity';
    import { UserRepository } from './user.repository';
    
    @Module({
      imports: [TypeOrmModule.forFeature([User])],
      providers: [
        {
          provide: UserRepository,
          useFactory: (repo: Repository<User>) => repo.extend(UserRepository),
          inject: [getRepositoryToken(User)],
        },
      ],
      exports: [UserRepository],
    })
    export class UserModule {}
    

    通过repo.extend(UserRepository)扩展基础Repository实例,确保自定义方法能被正确调用和注入。

  • 异常处理的合理性:当前无论什么错误都抛出UnauthorizedException不够严谨。如果是数据库连接失败等系统错误,应该抛出InternalServerErrorException;只有当确认是用户凭证无效(比如用户不存在)时,再抛出UnauthorizedException。可以根据错误类型做分支处理。

内容的提问来源于stack exchange,提问作者Web Projects Sun

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 04:06:13