You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 02:30:58