NestJS中RequestDTO的book对象参数丢失问题咨询
问题原因及解决办法
你的book字段被过滤掉,核心原因是NestJS默认启用的ValidationPipe开启了whitelist(白名单)模式——这个模式会自动移除所有没有添加class-validator/class-transformer装饰器的属性。你的book字段既没有验证装饰器,也没有转换装饰器,所以被当成“非白名单属性”给过滤掉了。
解决方法有两种:
方法一:给book字段添加验证规则(推荐)
如果需要验证book对象的结构,最好单独定义一个DTO类,再用嵌套验证装饰器:
// 先定义BookDTO export class BookDTO { @IsString() authorone: string; @IsString() authortwo: string; } // 修改RequestDTO import { ValidateNested } from 'class-validator'; import { Type } from 'class-transformer'; export class RequestDTO { @IsString() name: string; @ValidateNested() @Type(() => BookDTO) book: BookDTO; @IsString() title: string = 'Test Book!'; }
这样不仅能保留book数据,还能对其内部字段做验证。
方法二:允许未验证的字段保留
如果不需要对book做验证,只是想让它被保留,可以直接给book字段加@Allow()装饰器:
import { Allow } from 'class-validator'; export class RequestDTO { @IsString() name: string; @Allow() book: { authorone: string; authortwo: string; }; @IsString() title: string = 'Test Book!'; }
或者在全局配置ValidationPipe时关闭whitelist(不推荐,会失去白名单的安全过滤能力):
// main.ts async function bootstrap() { const app = await NestFactory.create(AppModule); app.useGlobalPipes(new ValidationPipe({ whitelist: false, // 关闭白名单,所有字段都会保留 })); await app.listen(3000); } bootstrap();
内容的提问来源于stack exchange,提问作者saravanan mp
相关产品推荐
相关产品推荐

