NestJS嵌套数组DTO问题:请求体无法被Swagger识别求助
解决NestJS嵌套数组DTO请求体为空的问题
问题原因
NestJS依赖class-transformer和class-validator解析、验证请求体,嵌套数组DTO需要显式指定元素类型并启用嵌套验证,否则框架无法将JSON正确转换为类实例,导致请求体解析为空。
解决方案步骤
1. 为嵌套数组添加必要装饰器
修改CreatePageDto,引入IsArray、ValidateNested和Type装饰器,明确数组元素类型:
import { IsArray, ValidateNested, Type } from 'class-validator'; import { ApiHideProperty, ApiProperty } from '@nestjs/swagger'; import { CreatePageTranslateDto } from './create-page-translate.dto'; // 根据实际路径调整 export class CreatePageDto { @ApiHideProperty() createAt: Date; @ApiHideProperty() updateAt: Date; @ApiProperty({ type: CreatePageTranslateDto, isArray: true, }) @IsArray() @ValidateNested({ each: true }) // 对数组每个元素做嵌套验证 @Type(() => CreatePageTranslateDto) // 指定数组元素的转换类型 translations: CreatePageTranslateDto[]; }
2. 启用ValidationPipe
全局注册(推荐)
在main.ts中全局配置,确保请求体自动转换为类实例:
import { ValidationPipe } from '@nestjs/common'; import { NestFactory } from '@nestjs/core'; import { AppModule } from './app.module'; async function bootstrap() { const app = await NestFactory.create(AppModule); app.useGlobalPipes(new ValidationPipe({ transform: true, // 必须开启,class-transformer才能工作 whitelist: true, // 过滤DTO中未定义的属性 })); await app.listen(3000); } bootstrap();
控制器方法单独启用
如果不需要全局配置,可在对应控制器方法上单独启用:
import { Body, Controller, Post, UsePipes, ValidationPipe } from '@nestjs/common'; import { CreatePageDto } from './dto/create-page.dto'; import { PagesService } from './pages.service'; @Controller('pages') export class PagesController { constructor(private readonly pagesService: PagesService) {} @Post() @UsePipes(new ValidationPipe({ transform: true })) create(@Body() createPageDto: CreatePageDto) { return this.pagesService.create(createPageDto); } }
3. 验证枚举定义
确保AvailableLanguages枚举包含请求中使用的es值,示例:
export enum AvailableLanguages { ES = 'es', EN = 'en', // 其他语言选项... }
验证请求
重启服务后,再次发送原curl请求,请求体即可被正确解析。
内容的提问来源于stack exchange,提问作者Álex Goia
相关产品推荐
相关产品推荐

