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

4

2 回答 2

26

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

另外,请记住将Content-Type请求标头设置为application/json.

于 2018-06-01T15:41:22.250 回答
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)

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

于 2021-05-21T08:30:32.007 回答