1

这听起来像一个非常简单的问题,但我一直在寻找一个很长一段时间的解决方案。我想验证端点中的一组 UUID。

像这样: ["9322c384-fd8e-4a13-80cd-1cbd1ef95ba8", "986dcaf4-c1ea-4218-b6b4-e4fd95a3c28e"]

我已经{ "id": ["9322c384-fd8e-4a13-80cd-1cbd1ef95ba8", "986dcaf4-c1ea-4218-b6b4-e4fd95a3c28e"]}使用以下代码成功地将它实现为 JSON 对象:

public getIds(
  @Body(ValidationPipe)
  uuids: uuidDto
) {
  console.log(uuids);
}
import { ApiProperty } from '@nestjs/swagger';
import { IsUUID } from 'class-validator';

export class uuidDto {
  @IsUUID('4', { each: true })
  @ApiProperty({
    type: [String],
    example: [
      '9322c384-fd8e-4a13-80cd-1cbd1ef95ba8',
      '986dcaf4-c1ea-4218-b6b4-e4fd95a3c28e',
    ],
  })
  id!: string;
}

但不幸的是,我无法自定义调用该端点的函数。所以我需要一个解决方案来只验证一组 uuid。

4

2 回答 2

0

您可以为其构建自定义验证管道

@Injectable()
export class CustomClassValidatorArrayPipe implements PipeTransform {

  constructor(private classValidatorFunction: (any)) {}

  transform(value: any[], metadata: ArgumentMetadata) {
    const errors = value.reduce((result, value, index) => {
      if (!this.classValidatorFunction(value))
        result.push(`${value} at index ${index} failed validation`)
      return result
    }, [])

    if (errors.length > 0) {
      throw new BadRequestException({
        status: HttpStatus.BAD_REQUEST,
        message: 'Validation failed',
        errors
      });
    }

    return value;
  }
}

在您的控制器中:

@Post()
createExample(@Body(new CustomClassValidatorArrayPipe(isUUID)) body: string[]) {
  ...
}
  • 确保使用class-validator 中的小写函数。它必须isUUID代替IsUUID. (这用于使用 class-validator 进行手动验证。)
  • CustomClassValidatorArrayPipe是构建模块化的。您可以使用它验证任何其他类型。例如MongoId@Body(new CustomClassValidatorArrayPipe(isMongoId)) body: ObjectId[]

结果

如果你发送这个:

POST http://localhost:3000/example
Content-Type: application/json

[
  "986dcaf4-c1ea-4218-b6b4-e4fd95a3c28e",
  "123",
  "test"
]

服务器会回复:

{
  "status": 400,
  "message": "Validation failed",
  "errors": [
    "123 at index 1 failed validation",
    "test at index 2 failed validation"
  ]
}
于 2021-12-25T12:02:46.257 回答
0

而不是类型字符串,写字符串[]。如下所示:

import { ApiProperty } from '@nestjs/swagger';
import { IsUUID } from 'class-validator';

export class uuidDto {
  @IsUUID('4', { each: true })
  @ApiProperty({
    type: string[],
    example: [
      '9322c384-fd8e-4a13-80cd-1cbd1ef95ba8',
      '986dcaf4-c1ea-4218-b6b4-e4fd95a3c28e',
    ],
  })
  id!: string[];
}
于 2021-12-04T13:24:18.220 回答