NestJS中使用class-validator验证请求体中interface类型字段的方法
NestJS class-validator 嵌套数组字段校验方案
class-validator仅支持对类实例做校验,interface在TS编译后会被抹除无法被识别,所以需要按以下步骤改造:
步骤1:将Experience接口改造为校验类
把原来的Experience接口改为Class类型,并给内部字段加上对应的校验装饰器:
import { IsEnum, IsNumber, Min } from 'class-validator'; export enum Fields { Full_Stack_Dev = 'full stack dev', Frontend_Dev = 'frontend dev', Backend_Dev = 'backend dev', } export class Experience { @IsEnum(Fields) field: Fields; @IsNumber() @Min(0) // 可根据业务需求调整最小值规则 years: number; }
步骤2:给DTO中的experience字段添加校验装饰器
需要结合三个装饰器实现数组嵌套校验:
@IsArray():校验字段值是数组类型@ValidateNested():触发对数组内每一个元素的校验@Type():来自class-transformer包,用于将请求传入的普通对象自动转换为Experience类实例,否则嵌套校验不会生效
完整DTO代码示例:
import { IsEnum, IsArray, ValidateNested } from 'class-validator'; import { Type } from 'class-transformer'; import { Experience } from './对应的文件路径'; // 假设你已经定义了Languages枚举 export class YourDto { @IsEnum(Languages, { each: true }) // 数组枚举校验必须加each:true,否则只能校验单个枚举值 languages: Languages[]; @IsArray() @ValidateNested({ each: true }) @Type(() => Experience) experience: Experience[]; }
注意事项
如果你的项目全局ValidationPipe没有开启自动转换,需要在注册pipe时添加transform: true配置,否则@Type装饰器不会生效:
// main.ts 中注册全局ValidationPipe app.useGlobalPipes(new ValidationPipe({ transform: true, // 其他配置按需添加 }));
内容的提问来源于stack exchange,提问作者Karan Kumar
相关产品推荐
相关产品推荐

