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解析请求体:
- 安装依赖:
npm install @nestjs/platform-express multer # 或使用yarn yarn add @nestjs/platform-express multer
- 修改控制器,添加拦截器解析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 }); } }
- 优化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
相关产品推荐
相关产品推荐

