NestJS class-使用接口对传入请求进行验证
NestJS class-validators on incoming requests using interface
我需要通过 class-validator 使用接口来验证传入请求正文中特定字段的传入表单。
界面:
export enum Fields {
Full_Stack_Dev = 'full stack dev',
Frontend_Dev = 'frontend dev',
Backend_Dev = 'backend dev',
}
export interface Experience {
field: Fields;
years: number;
}
这里是 DTO
Class:
@IsEnum(Languages)
languages: Languages[];
experience: Experience[]; // Not sure which decorator to use for interfaces
好的,经过大量研究,我找到了一个解决方法:
首先,接口不能直接使用。由 class 验证者正式声明问题 here
这是我做的:
- 将界面更改为 单独的 class 并添加了对其属性的验证
class ExperienceDto {
@IsEnum(Fields)
field: Fields;
@IsNumber()
years: number;
}
- 然后使用此 class 作为类型来验证 ACTUAL DTO CLASS(不是上面那个)
中的 对象数组
@ArrayNotEmpty()
@ArrayMinSize(1)
@ArrayMaxSize(3)
@ValidateNested({ each: true })
@Type(() => ExperienceDto) // imported from class-transformer package
experience: ExperienceDto[];
我需要通过 class-validator 使用接口来验证传入请求正文中特定字段的传入表单。
界面:
export enum Fields {
Full_Stack_Dev = 'full stack dev',
Frontend_Dev = 'frontend dev',
Backend_Dev = 'backend dev',
}
export interface Experience {
field: Fields;
years: number;
}
这里是 DTO
Class:
@IsEnum(Languages)
languages: Languages[];
experience: Experience[]; // Not sure which decorator to use for interfaces
好的,经过大量研究,我找到了一个解决方法:
首先,接口不能直接使用。由 class 验证者正式声明问题 here
这是我做的:
- 将界面更改为 单独的 class 并添加了对其属性的验证
class ExperienceDto {
@IsEnum(Fields)
field: Fields;
@IsNumber()
years: number;
}
- 然后使用此 class 作为类型来验证 ACTUAL DTO CLASS(不是上面那个) 中的 对象数组
@ArrayNotEmpty()
@ArrayMinSize(1)
@ArrayMaxSize(3)
@ValidateNested({ each: true })
@Type(() => ExperienceDto) // imported from class-transformer package
experience: ExperienceDto[];