Postman发送text/plain格式请求体后后端控制器取不到内容如何解决
问题原因
NestJS 默认内置的请求体解析器仅支持 application/json、application/x-www-form-urlencoded、multipart/form-data 三种常见请求类型,默认不会解析 text/plain 类型的请求体,所以你拿到的 req.body 和 @Body() 都会是空值。
解决方案
方案1:全局启用 text/plain 解析(适合大多数场景)
如果你用的是 Express 底层(NestJS 默认底层)
修改项目的 main.ts 文件,添加 Express 自带的 text 解析中间件:
import { NestFactory } from '@nestjs/core'; import { AppModule } from './app.module'; import * as express from 'express'; async function bootstrap() { const app = await NestFactory.create(AppModule); // 新增这一行,开启text/plain类型的请求体解析 app.use(express.text({ type: 'text/plain' })); await app.listen(3000); } bootstrap();
如果你用的是 Fastify 底层
修改 main.ts 新增 text/plain 类型解析规则:
import { NestFactory } from '@nestjs/core'; import { AppModule } from './app.module'; import { FastifyAdapter, NestFastifyApplication } from '@nestjs/platform-fastify'; async function bootstrap() { const app = await NestFactory.create<NestFastifyApplication>( AppModule, new FastifyAdapter() ); // 新增text/plain类型解析 const fastifyInstance = app.getHttpAdapter().getInstance(); fastifyInstance.addContentTypeParser('text/plain', { parseAs: 'string' }, (req, body, done) => { done(null, body.toString()); }); await app.listen(3000); } bootstrap();
配置完成后,控制器里的 @Body() 就可以直接拿到完整的 text 格式请求体字符串,如果你需要把请求体转成对象,可以自行调用 JSON.parse() 处理:
async testFunction(@Body() body: string) { // body就是请求体的完整字符串 const data = JSON.parse(`{${body}}`); // 注意你当前发的请求体外层缺大括号,合法JSON需要补全 console.log(data); }
方案2:仅指定路由启用解析(不需要全局生效)
如果你不想全局开启 text 解析,可以自定义中间件,仅绑定到需要接收 text/plain 请求的路由上即可,逻辑和全局配置一致,仅作用范围限定到指定路由。
注意事项
你当前在 Postman 里发送的请求体不是合法的 JSON 格式,外层缺少大括号包裹,如果实际业务传输的是 JSON 内容,更推荐直接使用 content-type: application/json 类型,不需要额外配置解析规则,NestJS 会自动转成对象返回给 @Body()。
内容的提问来源于stack exchange,提问作者Tushar Roy
相关产品推荐
相关产品推荐

