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

NestJS中使用DTO接收multipart/form-data时获取空对象问题

解决NestJS中multipart/form-data请求的DTO类型绑定问题

问题分析

你在使用NestJS处理multipart/form-data请求时,遇到了带类型定义的MyDto无法正确接收请求体数据的问题:

  • 给@Body()指定MyDto类型时,打印出空的MyDto {}
  • 移除类型定义后,能正常拿到[Object: null prototype] { year: '2022' }
  • 文件上传始终正常,说明multer的配置无问题

核心原因是:multipart/form-data请求由multer解析后生成的是无原型的普通对象,而NestJS的ValidationPipe默认的类型转换依赖class-transformer,需要DTO类上有明确的装饰器标记,才能正确将普通对象转换为DTO实例。

解决方案

1. 给DTO属性添加class-validator装饰器

先确保安装依赖:

npm install class-validator class-transformer

修改MyDto,为属性添加装饰器(即使是基础类型,也需要标记):

import { IsString } from 'class-validator';

export class MyDto {
  @IsString()
  year: string;
}

2. 调整ValidationPipe的transform配置

在main.ts中,给ValidationPipe添加更明确的转换选项,确保能将无原型对象转换为类实例:

app.useGlobalPipes(
  new ValidationPipe({
    whitelist: true,
    transform: true,
    transformOptions: {
      enableImplicitConversion: true,
      excludeExtraneousValues: true,
    },
  })
);

3. 验证效果

修改后重新发送请求,此时@Body() body: MyDto应该能正确输出包含year字段的MyDto实例:

MyDto { year: '2022' }

补充说明

  • 无原型对象是multer解析multipart/form-data的默认行为,class-transformer需要明确的装饰器或转换配置才能识别并转换为类实例
  • enableImplicitConversion选项会自动转换基础类型,避免手动添加过多装饰器(但推荐添加对应验证装饰器,保证数据合法性)

内容的提问来源于stack exchange,提问作者Vinícius Santos de Pontes

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 12:54:23