0

我正在构建一个 NestJS 应用程序,我正在尝试使用 aValidationPipe来验证我的请求正文和查询参数。我的ValidationPipe样子是这样的(为简单起见,省略了一些代码):

@Injectable()
export class ValidationPipe implements PipeTransform<any> {
  private readonly groups?: string[];
  constructor(groups?: string[]) {
    this.groups = groups;
  }

  async transform(value: any, { metatype }: ArgumentMetadata) {
    if (!metatype || !this.toValidate(metatype)) {
      return value;
    }
    const object = plainToClass(metatype, value);
    const errors = await validate(object, {
      groups: this.groups,
    });
    if (errors.length > 0) {
      const violations: Violation[] = [];
      errors.forEach(error => {
        const firstConstraint = getFirstConstraint(
          Object.keys(error.constraints),
        );
        violations.push(
          mapConstraintToViolation(firstConstraint, error.property),
        );
      });
      throw new BadRequestException(new ValidationFailure(violations));
    }
    return value;
  }
}

另外,我有一个带有这个签名的控制器方法:

  @UseInterceptors(ClassSerializerInterceptor)
  @Put(':id')
  async update(
    @Param('id', new ValidationPipe()) updateParams: UpdateParams,
    @Body(new ValidationPipe(['update'])) userManagementDto: UserManagementDto,
  ): Promise<UserManagementDto>;

请求正文验证工作正常。我的UserManagementDto正确解析和验证。但是 id 参数的验证不能正常工作。id 参数被序列化为纯字符串(如您在打印屏幕中所见):

Id 参数转换为纯字符串而不是 UserManagementDto 的实例

UpdateParams类是这样的:

import { IsUUID } from 'class-validator';

export class UpdateParams {
  @IsUUID()
  id: string;
}

我以PUT这种方式提出请求:

PUT /users/f10ac0de-0783-48ad-b9bf-c3ba77f8ed06 HTTP/1.1
Host: localhost:3000
Content-Type: application/json

{
    "name": "Bruno Peres",
    "email": "bruno3@domain.com.br" 
}

ValidationPipe以框架文档提供的示例为基础。

我究竟做错了什么?谢谢您的帮助!

4

0 回答 0