【问题标题】:How to validate array of uuid in nest js using class validator?如何使用类验证器验证嵌套 js 中的 uuid 数组?
【发布时间】:2021-05-19 10:50:04
【问题描述】:

如何验证 uuid 数组? 我正在使用预构建的 ParseArrayPipe 来验证有效负载数组结构。

@Post(':id/players')
  addPlayers(
    @Body(new ParseArrayPipe({ items: GamePlayerDto, separator: ',' }))
    gamePlayers: GamePlayerDto,
  ) {
    console.log(gamePlayers);
  }
export class GamePlayerDto {
  @IsUUID()
  playerId!: string;
}

我不希望类验证器检查 playerId 属性是否在这里,但只有原始值

例如这是我的服务器应该收到的

["73aef2dd-c227-4774-b547-b3117b543863", "73aef2dd-c227-4774-b547-b3117b543863"]

【问题讨论】:

    标签: typescript nestjs class-validator


    【解决方案1】:

    ParseArrayPipe 不会验证值,它只会将值转换为数组。使用ValidationPipe查看是否为uuid。

    【讨论】:

      【解决方案2】:

      您必须设置选项 - “each: true”。

      export class GamePlayerDto {
        @IsUUID(UUIDVersion,{each:true})
        playerId!: string;
      }
      

      接受的 UUID 版本值 - '3' | '4' | '5' | 'all' | 3 | 4 | 5;

      引用官方文档-“指定验证值是否为数组,并且必须验证其每个项目。”

      本质上,playerId 的值被认为是一个数组,并且是 UUID 类型(指定版本),每个值都必须经过验证。

      更新

      还将您的请求处理程序更新为:

      @Post(':id/players')
        addPlayers(
          @Body(ValidationPipe))
          gamePlayers: GamePlayerDto,
        ) {
          console.log(gamePlayers);
        }
      

      ValidationPipe 是 NestJS 中的默认管道,它与类验证器协同工作。它将验证传入的请求正文/参数等。如果它不符合 DTO 中设置的条件,则拒绝。

      【讨论】:

        【解决方案3】:

        您可以编写自定义类验证器。验证服务器接收到的数组只包含 UUID

        import {
          registerDecorator,
          ValidationArguments,
          ValidationOptions,
        } from 'class-validator';
        
        import validator from 'validator';
        
        export function IsUuidArray(validationOptions?: ValidationOptions) {
          // eslint-disable-next-line @typescript-eslint/ban-types
          return function (object: Object, propertyName: string) {
            let fakeElements = [];
            registerDecorator({
              name: 'IsUuidArray',
              target: object.constructor,
              propertyName: propertyName,
              options: validationOptions,
              validator: {
                defaultMessage(): string {
                  return `[${fakeElements}] is not uuid`;
                },
                validate(value: string[], args: ValidationArguments) {
                  fakeElements = [];
                  let isOnlyUuid = true;
                  value.forEach((element) => {
                    const result = validator.isUUID(element);
                    if (!result) {
                      isOnlyUuid = result;
                      fakeElements.push(element);
                    }
                  });
                  return isOnlyUuid;
                },
              },
            });
          };
        }
        

        你可以这样使用它

        export class CreateInsuranceCommand {
          @ApiProperty()
          @IsUuidArray()
          @IsOptional()
          @IsArray()
          providers: string[];
        }
        

        我使用validator 来检查字符串是否为uuid

        【讨论】:

          【解决方案4】:

          你可以使用它

          @IsUUID(undefined, {each:true})
          providers: string[]
          

          【讨论】:

            猜你喜欢
            • 2020-07-30
            • 2021-04-22
            • 2019-05-16
            • 1970-01-01
            • 1970-01-01
            • 2022-10-31
            • 2019-05-08
            • 2014-05-18
            相关资源
            最近更新 更多