如何在Nest.js中验证嵌套对象组成的请求列表参数
报错是因为class-validator校验嵌套结构时,需要配合class-transformer的@Type装饰器明确指定嵌套对象的构造类,TS的类型标注会在编译后丢失,运行时无法识别嵌套的RoomMate类型。
修正步骤
- 从
class-transformer包导入@Type装饰器 - 在
roomMates属性上添加@Type(() => RoomMate)注解,和现有@ValidateNested配合使用 - 确保
RoomMate类本身的属性也正确添加了class-validator的校验注解
修正后的完整代码
import { Type } from 'class-transformer'; import { ApiProperty } from '@nestjs/swagger'; import { IsNotEmpty, IsString, IsArray, ValidateNested } from 'class-validator'; import { RoomMate } from './room-mate.dto'; export class Room { @ApiProperty() @IsNotEmpty() @IsString() name: string; @ApiProperty({ type: [RoomMate] }) @IsNotEmpty() @IsArray() @ValidateNested({ each: true }) @Type(() => RoomMate) roomMates: RoomMate[]; }
全局管道配置要求
需要确保NestJS的ValidationPipe开启了transform配置,否则类型转换不会生效,配置示例如下:
// main.ts 全局管道配置 app.useGlobalPipes(new ValidationPipe({ transform: true, whitelist: true }));
内容的提问来源于stack exchange,提问作者koallalays
相关产品推荐
相关产品推荐

