NestJS - 如何使用 @Body() 装饰器访问帖子正文?
Posted
技术标签:
【中文标题】NestJS - 如何使用 @Body() 装饰器访问帖子正文?【英文标题】:NestJS - How to access post body using @Body() decorator? 【发布时间】:2018-10-09 11:27:49 【问题描述】:import Controller, Post, Body from '@nestjs/common';
import MyService from 'my.service';
import MyDto from './dto/my.dto';
@Controller('my-route')
export class MyController
constructor(private readonly _myService: MyService)
@Post()
async myMethod(@Body() myDto: MyDto)
console.log(myDto); // undefined
return await this._myService.doStuff(myDto.elementOfInterest); // Passes undefined variable into method.
我对从 Nest 中的 POST 访问正文表单数据的正确方法感到困惑。文档和示例都显示了 @Body()
装饰器在参数名称之前的简单用法,该参数将包含正文(如果使用参数,则为正文中的特定元素)。然而在我上面的例子中,body 永远不会被填充,并且在 myDto
未定义的情况下调用该方法。即使将其类型更改为字符串并在我的 POST 正文中简单地传递一个键/值对,它也会未定义。
在 Nest 中处理 POST 正文的正确方法是什么?
【问题讨论】:
您是否添加了任何全局Pipe
或Interceptor
?我刚刚从一个空白的 Nest 项目中快速检查了一下,创建了一个带有 @Body()
参数的 @Post()
控制器,我让它按预期工作。 编辑 - 我刚刚尝试了您的确切代码,没有 MyDto 和 MyService,它也可以工作。您使用的是哪个版本的 NestJS?
没有管道或拦截器。我在 4.5.10 和 4.6.6 中都进行了测试,并且具有相同的行为。当我将表单数据发送到服务器时,代码会执行,但 body 参数未定义。
另外,请记住将 Content-Type
请求标头设置为 application/json
。
解决了。
【参考方案1】:
Kamil Mysliwiec 关于Content-Type
的评论是解决方案。
另外,请记住将
Content-Type
请求标头设置为application/json
。
【讨论】:
【参考方案2】:以防有人偶然发现我的问题。
我也有这个问题,但对我来说是在main.ts
的服务器设置中。
我将此代码设置为包含 ssl 证书以与 https 一起使用,但仅限于生产中
let serverOptions = null;
if (environment.production)
const httpsOptions =
key: fs.readFileSync(environment.sslKeyPath),
cert: fs.readFileSync(environment.sslCertPath),
;
serverOptions = httpsOptions ;
const app = await NestFactory.create(AppModule, serverOptions)
但显然创建带有选项null
的服务器会破坏它。
所以我把它改成了这样,因为它适用于 undefined
const app = await NestFactory.create(AppModule, serverOptions ?? undefinded)
或者做这样的事情,因为我不知道将选项设置为 undefined 是否安全
const app = serverOptions ? await NestFactory.create(AppModule, serverOptions) : await NestFactory.create(AppModule)
希望这可以帮助遇到类似问题的人
【讨论】:
以上是关于NestJS - 如何使用 @Body() 装饰器访问帖子正文?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用来自@nestjs/mongoose 的@Prop 装饰器添加嵌套的对象数组
@nestjs/swagger:如何在没有 @ApiOkResponse 装饰器的情况下添加架构?