如何在NestJS控制器中获取前端提交的form data表单数据
问题原因
NestJS 默认内置的 body 解析器仅支持 application/json 和 application/x-www-form-urlencoded 格式的请求,不会解析 multipart/form-data 类型的表单数据,因此直接用 @Body() 拿到的是空对象。
解决步骤
- 安装依赖
NestJS 基于 multer 处理 form-data 格式数据,首先需要安装相关依赖:
# 安装multer核心库 npm install multer # 安装multer的TS类型声明 npm install --save-dev @types/multer
- 控制器代码修改
如果你的接口没有上传文件,仅包含普通表单字段,使用NoFilesInterceptor拦截器即可,修改后的代码如下:
import { Controller, Post, Body, UseInterceptors } from "@nestjs/common"; import { NoFilesInterceptor } from "@nestjs/platform-express"; @Controller() export class AuthenticationController { constructor() { } @Post('public/login') @UseInterceptors(NoFilesInterceptor()) login(@Body() body) { console.log(body); // 此时可正常打印 {login: 'sampleuser', password: 'userpassword'} return body; } }
扩展场景
如果接口同时包含文件上传和普通表单字段,根据你的字段场景选择对应的拦截器即可,普通表单字段仍会自动挂载到 @Body() 中:
- 单文件上传:使用
FileInterceptor('文件字段名') - 多指定字段文件上传:使用
FileFieldsInterceptor([{name: '字段1'}, {name: '字段2'}]) - 任意文件上传:使用
AnyFilesInterceptor()
内容的提问来源于stack exchange,提问作者user3818264
相关产品推荐
相关产品推荐

