NestJS - 如何使用@Body()装饰器访问帖子正文?

时间:2018-04-29 00:46:07

标签: typescript express nestjs

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()装饰器的简单使用,该参数将包含正文(如果使用参数,则为正文中的特定元素)。然而,在上面的示例中,从未填充正文,并且在未定义myDto的情况下调用该方法。即使将其类型更改为字符串并简单地在POST的正文中传递单个键/值对,也会使其未定义。

在Nest中处理POST主体的正确方法是什么?

2 个答案:

答案 0 :(得分:5)

Kamil Mysliwiec关于Content-Type的评论是解决方案。

  

另外,请注意将Content-Type请求标头设置为application/json

答案 1 :(得分:2)

万一有人偶然发现我的问题。 我也有这个问题,但对我来说是在 main.ts 的服务器设置中。

我将此代码设置为包含与 https 一起使用的 ssl 证书,但仅在生产中使用

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)

希望这对有类似问题的人有所帮助