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

NestJS使用DTO接收POST请求时返回空Body问题排查

问题解决:NestJS DTO接收请求体为空,Prisma创建数据报错

核心问题分析

  1. DTO字段与请求体完全不匹配:你的CreateProductDto定义的是title、body等字段,但实际请求体传的是name、price、image、categoryId,两者没有对应字段,导致NestJS无法将请求体映射到DTO,最终得到空对象{}。
  2. 缺少DTO验证与转换配置:NestJS需要class-validator和class-transformer包来处理DTO的请求体解析,若未安装或未全局启用ValidationPipe,也会导致DTO无法正确接收数据。

分步解决方案

1. 修正CreateProductDto字段,匹配请求体和Prisma Schema

根据你的请求体和Prisma报错信息(需要name字段),修改DTO如下:

import { ApiProperty } from '@nestjs/swagger';
import { IsString, IsNumber, IsOptional } from 'class-validator';

export class CreateProductDto {
    @ApiProperty()
    @IsString()
    name: string;

    @ApiProperty({ required: false })
    @IsOptional()
    @IsString()
    description?: string;

    @ApiProperty()
    @IsNumber()
    price: number;

    @ApiProperty({ required: false })
    @IsOptional()
    @IsString()
    image?: string;

    @ApiProperty()
    @IsString()
    categoryId: string;
}

2. 安装并配置class-validator和class-transformer

如果还没安装这两个依赖,执行:

npm install class-validator class-transformer

然后在main.ts中全局启用ValidationPipe,确保请求体能被正确转换和验证:

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({
    transform: true, // 自动将请求体转换为DTO实例
    whitelist: true, // 过滤DTO中未定义的字段
  }));
  await app.listen(3000);
}
bootstrap();

3. 修正ProductService中的导入错误

你的ProductService里错误导入了CreateArticleDto,删掉这行无用代码:

// 删掉这行
import { CreateArticleDto } from 'src/articles/dto/create-article.dto';

4. 验证请求体格式

确保请求时设置Content-Type: application/json,并且请求体字段和DTO完全对应,比如:

{
  "name": "Amazing Product",
  "description": "This is a fantastic product you'll love!",
  "price": 10000,
  "image": "https://example.com/product-image.jpg", 
  "categoryId": "1"
}

验证结果

完成上述修改后,重新启动服务,发起POST请求:

  • 控制台会正确打印请求体数据
  • Prisma的product.create方法能获取到所需的name等字段,不会再报参数缺失错误

内容的提问来源于stack exchange,提问作者Maszgalang

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 13:17:53