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主体的正确方法是什么?
答案 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)
希望这对有类似问题的人有所帮助