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实例:
无需额外注入Repository:
UserRepository已经继承了Repository<User>,此时类本身就继承了父类的所有方法(包括findOne),完全没必要再通过@InjectRepository(User)注入一个独立的userRepository实例,这会造成不必要的实例创建,属于冗余设计。方法可直接简化:直接使用
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
相关产品推荐
相关产品推荐

