通过 application/x-www-form-urlencoded 请求类型的 @IsInt() 验证
Pass @IsInt() validation for application/x-www-form-urlencoded request type
当我查看 Pipes 文档时,我注意到我无法对 application/x-www-form-urlencoded[=60= 进行 @IsInt()
验证] 正确请求,导致我传递的所有值都作为字符串值接收。
我的请求数据是这样的
我的 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);
}
}
当我调试这个管道时,我注意到了这个状态
其中:
- value - 请求正文值
- object - 通过 class-transformer value
转换
- 错误 - 错误对象
如您所见,错误告诉我们年龄必须是整数。
如何通过 @IsInt()
对 application/x-www-form-urlencoded 请求的验证?
库版本:
- @nestjs/common@4.6.4
- class-transformer@0.1.8
- class-验证器@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;
}
当我查看 Pipes 文档时,我注意到我无法对 application/x-www-form-urlencoded[=60= 进行 @IsInt()
验证] 正确请求,导致我传递的所有值都作为字符串值接收。
我的请求数据是这样的
我的 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);
}
}
当我调试这个管道时,我注意到了这个状态
- value - 请求正文值
- object - 通过 class-transformer value 转换
- 错误 - 错误对象
如您所见,错误告诉我们年龄必须是整数。
如何通过 @IsInt()
对 application/x-www-form-urlencoded 请求的验证?
库版本:
- @nestjs/common@4.6.4
- class-transformer@0.1.8
- class-验证器@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;
}