【问题标题】:NestJS - How to access post body using @Body() decorator?NestJS - 如何使用 @Body() 装饰器访问帖子正文?
【发布时间】: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 正文的正确方法是什么?

【问题讨论】:

  • 您是否添加了任何全局PipeInterceptor?我刚刚从一个空白的 Nest 项目中快速检查了一下,创建了一个带有 @Body() 参数的 @Post() 控制器,我让它按预期工作。 编辑 - 我刚刚尝试了您的确切代码,没有 MyDto 和 MyService,它也可以工作。您使用的是哪个版本的 NestJS?
  • 没有管道或拦截器。我在 4.5.10 和 4.6.6 中都进行了测试,并且具有相同的行为。当我将表单数据发送到服务器时,代码会执行,但 body 参数未定义。
  • 另外,请记住将 Content-Type 请求标头设置为 application/json
  • 解决了。

标签: typescript express nestjs


【解决方案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)
    

    希望这可以帮助遇到类似问题的人

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-08
      • 2021-10-25
      • 2021-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-26
      相关资源
      最近更新 更多