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 正文的正确方法是什么?

【问题讨论】:

您是否添加了任何全局PipeInterceptor?我刚刚从一个空白的 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路由的方法上设置装饰器

@nestjs/swagger:如何在没有 @ApiOkResponse 装饰器的情况下添加架构?

mongoose @prop() 装饰器类型:模式定义中的对象_NestJS

NestJS 的自定义路由装饰器

NestJs:确保你的班级用合适的装饰器装饰