如何让NestJS的@ValidateNested允许未定义属性不报错
解决NestJS中@ValidateNested允许未定义属性的问题
问题原因
当前报错property should not exists是因为class-validator默认会校验对象是否包含未在类中定义的属性,结合NestJS的ValidationPipe默认配置(forbidUnknownValues: true),导致额外属性触发错误。
解决方案
方案一:针对单个类允许额外属性(推荐)
在SettingsClass上添加@Allow()装饰器,允许所有未显式添加校验规则的属性通过验证:
import { Allow, IsNotEmpty, ValidateNested, Type } from 'class-validator'; @Allow() export class SettingsClass { @IsNotEmpty() @ValidateNested() @Type(() => FormatSettingsClass) first_config!: FormatSettingsClass; @IsNotEmpty() @ValidateNested() @Type(() => FormatSettingsClass) second_config!: FormatSettingsClass; [key: string]: any; }
方案二:全局关闭未知属性校验
如果需要全局范围内允许所有验证对象包含未定义属性,可以修改ValidationPipe的配置:
// main.ts import { NestFactory } from '@nestjs/core'; import { ValidationPipe } from '@nestjs/common'; import { AppModule } from './app.module'; async function bootstrap() { const app = await NestFactory.create(AppModule); app.useGlobalPipes(new ValidationPipe({ forbidUnknownValues: false, transform: true, // 保持自动转换类实例的功能 })); await app.listen(3000); } bootstrap();
说明
- 方案一仅对
SettingsClass生效,不会影响其他类的校验规则,适合精准控制的场景。 - 方案二是全局配置,所有通过
ValidationPipe的验证都会允许未知属性,适合需要全局放宽校验的场景。
内容的提问来源于stack exchange,提问作者AMHF
相关产品推荐
相关产品推荐

