【发布时间】: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。 -
解决了。
标签: typescript express nestjs