NestJS自定义唯一值验证报错:EntityManager未注入,无法读取getRepository
解决NestJS自定义唯一值验证中EntityManager注入失败的问题
你遇到的Cannot read properties of undefined (reading 'getRepository')错误,核心原因是自定义验证约束类未正确启用依赖注入,导致EntityManager无法被注入。以下是具体修复步骤:
1. 为约束类添加必要装饰器
你的IsUniqueConstraint缺少两个关键装饰器:@Injectable()(让NestJS识别为可注入类)和@ValidatorConstraint()(让class-validator识别为验证约束)。修改后的代码如下:
import { Injectable } from '@nestjs/common'; import { ValidatorConstraint, ValidatorConstraintInterface, ValidationArguments } from 'class-validator'; import { EntityManager } from 'typeorm'; @Injectable() @ValidatorConstraint({ name: 'isUnique', async: true }) export class IsUniqueConstraint implements ValidatorConstraintInterface { constructor(private readonly entityManager: EntityManager) {} async validate(value: any, args?: ValidationArguments): Promise<boolean> { const { tableName, column } = args.constraints[0]; const dataExist = await this.entityManager.getRepository(tableName) .createQueryBuilder(tableName) .where({ [column]: value }) .getExists(); return !dataExist; } // 可选:自定义错误提示信息 defaultMessage(args?: ValidationArguments): string { const { column } = args.constraints[0]; return `${column} 已存在,请输入其他值`; } }
2. 确保自定义验证装饰器关联约束类
如果使用自定义@IsUnique装饰器,需确保它正确关联到约束类:
import { registerDecorator, ValidationOptions } from 'class-validator'; import { IsUniqueConstraint } from './is-unique.constraint'; export function IsUnique(options: { tableName: string; column: string }, validationOptions?: ValidationOptions) { return function (object: Object, propertyName: string) { registerDecorator({ target: object.constructor, propertyName: propertyName, options: validationOptions, constraints: [options], validator: IsUniqueConstraint, }); }; }
3. 验证现有配置的正确性
- 你在
AppModule的providers中注册IsUniqueConstraint的操作是正确的 main.ts中useContainer(app.select(AppModule), { fallbackOnErrors: true });的配置没问题,确保class-validator能使用NestJS的依赖注入容器- TypeORM配置正常,
EntityManager可被全局注入
完成以上修改后,重新启动服务即可解决注入失败的问题。
内容的提问来源于stack exchange,提问作者Hager Khaled
相关产品推荐
相关产品推荐

