NestJS中class-validator唯一字段验证依赖注入失败问题排查
解决NestJS中class-validator自定义验证器依赖注入undefined的问题
核心原因:箭头函数导致this指向错误
你在UniqueFieldValidator中把validate定义成了箭头函数,箭头函数不会绑定类实例的this,而是继承外层作用域的this,因此this.userService会返回undefined。
解决方案步骤
1. 将validate改为普通函数
修改UniqueFieldValidator的validate方法,去掉箭头函数,改用普通函数以确保this指向类实例:
import { ValidatorConstraint, ValidatorConstraintInterface, ValidationArguments } from 'class-validator'; import { Injectable } from '@nestjs/common'; import { UserService } from './user.service'; @ValidatorConstraint({ name: 'unique', async: true }) @Injectable() export class UniqueFieldValidator implements ValidatorConstraintInterface { constructor(private readonly userService: UserService) {} // 改为普通函数,确保this指向类实例 async validate(value: any, args: ValidationArguments): Promise<boolean> { console.log(this.userService); // 现在能正确获取到服务实例 const [entityClass, fieldName] = args.constraints; const entity = await this.userService.findByFieldValue({ [fieldName]: value }); return !entity; } defaultMessage(args: ValidationArguments) { const [entityClass, fieldName] = args.constraints; return `${fieldName} must be unique`; } }
2. 配置class-validator使用Nest的DI容器
在main.ts中添加useContainer配置,让class-validator能够利用Nest的依赖注入容器获取服务实例:
import { NestFactory } from '@nestjs/core'; import { AppModule } from './app.module'; import { ValidationPipe } from '@nestjs/common'; import { useContainer } from 'class-validator'; async function bootstrap() { const app = await NestFactory.create(AppModule); // 让class-validator使用Nest的DI容器 useContainer(app.select(AppModule), { fallbackOnErrors: true }); app.useGlobalPipes(new ValidationPipe({ transform: true, whitelist: true, })); await app.listen(3000); } bootstrap();
3. 确认模块配置正确
你的UserModule已经正确注册了UniqueFieldValidator和UserService,现有代码无需修改:
import { Module } from '@nestjs/common'; import { UserService } from './user.service'; import { UserController } from './user.controller'; import { TypeOrmModule } from '@nestjs/typeorm'; import { User } from './entities/user.entity'; import { UniqueFieldValidator } from './unique-field-validator'; @Module({ controllers: [UserController], providers: [UserService, UniqueFieldValidator], imports: [TypeOrmModule.forFeature([User])], exports: [UserService, TypeOrmModule] }) export class UserModule { }
验证效果
完成以上修改后重启应用,发送创建用户请求,this.userService将能正确获取到实例,不会再出现Cannot read properties of undefined的错误。
内容的提问来源于stack exchange,提问作者Harshadeva Priyankara Bandara
相关产品推荐
相关产品推荐

