class-transformer @Type()装饰器失效 嵌套DTO校验不生效
问题原因
@Type() 是class-transformer提供的装饰器,只负责把请求体里的普通JS对象转换成指定类的实例,本身不会触发嵌套对象的校验。你现在只给dataToUpdate加了@IsObject(),最多只能校验这个字段的值是个对象,根本不会跑UserModelDto里定义的那些字段规则。
修复方法
给dataToUpdate加个@ValidateNested()装饰器就行,这个装饰器是class-validator自带的,专门用来标记字段需要递归执行嵌套类的校验。改完的UpdateUserDto代码:
import { IsUUID, IsObject, ValidateNested } from 'class-validator'; import { Type } from 'class-transformer'; import { UserModelDto } from './user-model.dto'; export class UpdateUserDto { @IsUUID() public readonly uuid: string; @IsObject() @ValidateNested() @Type(() => UserModelDto) public readonly dataToUpdate: UserModelDto; }
无效排查清单
加完装饰器还是不生效的话,按下面顺序查:
- 确认你用的
ValidationPipe开了transform: true配置,不管是全局绑定还是接口局部绑定的pipe都要开,不开的话class-transformer根本不会跑类型转换,嵌套校验肯定触发不了。全局配置参考:
// main.ts async function bootstrap() { const app = await NestFactory.create(AppModule); app.useGlobalPipes( new ValidationPipe({ transform: true, // 这个配置必须开 whitelist: true, }) ); await app.listen(3000); } bootstrap();
- 确认
class-validator和class-transformer两个包都装好了,版本差太大也可能出问题 - 确认
UserModelDto是用class定义的,别用TS的interface,interface编译完就没了,运行时根本识别不到,你现在的class写法是对的 - 检查下有没有给DTO字段加错装饰器来源,比如
@Type别从class-validator里导,必须从class-transformer导
内容的提问来源于stack exchange,提问作者user15913196
相关产品推荐
相关产品推荐

