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

NestJS使用Mongoose无法将Form Data写入MongoDB求助

问题原因

你通过Postman发送的是**Form Data(multipart/form-data)**格式请求,但NestJS默认的@Body()装饰器仅支持解析application/json或application/x-www-form-urlencoded格式的请求体,无法直接处理multipart类型数据,导致createPostDTO接收为空对象,最终存入MongoDB的文档只有默认的_id和__v字段。

解决方法

方法1:快速切换请求格式(测试用)

在Postman中切换到x-www-form-urlencoded标签,输入title、description等对应键值对后发送请求。这种格式下@Body()能正常解析数据,可直接存入数据库。

方法2:配置支持multipart/form-data(正式方案)

如果业务需要支持Form Data格式,需通过multer解析请求体:

  1. 安装依赖:
npm install @nestjs/platform-express multer
# 或使用yarn
yarn add @nestjs/platform-express multer
  1. 修改控制器,添加拦截器解析multipart数据:
import { Controller, Post, Res, Body, UseInterceptors } from '@nestjs/common';
import { AnyFilesInterceptor } from '@nestjs/platform-express';
import { HttpStatus } from '@nestjs/common';
import { CreatePostDTO } from './create-post.dto';
import { BlogService } from './blog.service';

@Controller('blog')
export class BlogController {
  constructor(private readonly blogService: BlogService) {}

  @Post('/post')
  @UseInterceptors(AnyFilesInterceptor()) // 新增拦截器处理Form Data
  async addPost(@Res() res, @Body() createPostDTO: CreatePostDTO) {
    const newPost = await this.blogService.addPost(createPostDTO);
    return res.status(HttpStatus.OK).json({
      message: "Post has been submitted successfully!",
      post: newPost
    });
  }
}
  1. 优化Service代码(区分参数名与类型名,避免混淆):
async addPost(createPostDTO: CreatePostDTO): Promise<Post> {
  const newPost = new this.postModel(createPostDTO);
  return newPost.save();
}

额外检查项

  • 确认MongoDB连接正常,Schema字段与DTO字段完全匹配(当前代码中两者字段一致,无需调整);
  • 发送请求时,Postman中Form Data的键名需与DTO字段名完全一致(如title、description,大小写需对应)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 16:31:04