gpt4 book ai didi

node.js - 通过 @IsInt() 验证 application/x-www-form-urlencoded 请求类型

转载 作者:太空宇宙 更新时间:2023-11-03 21:52:48 25 4
gpt4 key购买 nike

当我浏览Pipes文档时,我注意到我无法对application/x-www-form-urlencoded<进行@IsInt()验证/strong> 正确请求,导致我传递的所有值都作为字符串值接收。

我的请求数据如下所示 enter image description here

我的 DTO 看起来像

import { IsString, IsInt } from 'class-validator';

export class CreateCatDto {
@IsString()
readonly name: string;

@IsInt()
readonly age: number;

@IsString()
readonly breed: string;
}

验证管道包含下一个代码

import { PipeTransform, Pipe, ArgumentMetadata, BadRequestException } from '@nestjs/common';
import { validate } from 'class-validator';
import { plainToClass } from 'class-transformer';

@Pipe()
export class ValidationPipe implements PipeTransform<any> {
async transform(value, metadata: ArgumentMetadata) {
const { metatype } = metadata;
if (!metatype || !this.toValidate(metatype)) {
return value;
}
const object = plainToClass(metatype, value);
const errors = await validate(object);
if (errors.length > 0) {
throw new BadRequestException('Validation failed');
}
return value;
}

private toValidate(metatype): boolean {
const types = [String, Boolean, Number, Array, Object];
return !types.find((type) => metatype === type);
}
}

当我调试这个管道时,我注意到这个状态 enter image description here地点:

  • - 请求正文值
  • 对象 - 通过类转换器值进行转换
  • 错误 - 错误对象

正如您所看到的,错误告诉我们年龄必须是整数

如何通过 application/x-www-form-urlencoded 请求的 @IsInt() 验证?

库版本:

  • @nestjs/common@4.6.4
  • class-transformer@0.1.8
  • class-validator@0.8.1

P.S:我还创建了一个 repository您可以在其中运行应用程序来测试错误。必需的分支how-to-pass-int-validation

UPD:在对已接受的答案进行更改后,我遇到了将错误的解析数据存储到存储中的问题。 Recorded example

是否可以很好地解析 createCatDto 或者我需要做什么才能用正确的类型结构保存它?

最佳答案

来自 application/x-www-form-urlencoded 请求的所有值始终是字符串。

因此,您可以执行以下操作:

import { Transform } from 'class-transformer';
import { IsString, IsInt } from 'class-validator';

export class CreateCatDto {
@IsString()
readonly name: string;

@Transform(value => Number.isNan(+value) ? 0 : +value) // this field will be parsed to integer when `plainToClass gets called`
@IsInt()
readonly age: number;

@IsString()
readonly breed: string;
}

关于node.js - 通过 @IsInt() 验证 application/x-www-form-urlencoded 请求类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48978370/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com