为什么 Post 请求中的 @Body() 不能正常工作?[Nest.js]

Dan*_*llo 5 nestjs

我开始学习 Nest.js,所以我正在学习 Academind 教程(链接)。

当我尝试body使用请求中的@Body()装饰器获取变量时,我的代码未按预期工作POST。在这部分代码之后products.controller.ts

@Post()
async addProduct(@Body() body: Product) {
  console.log(body);
  const generatedId = this.productService.insertProduct(body.title, body.description, 5.99);
  return generatedId;
}
Run Code Online (Sandbox Code Playgroud)

在终端中,输出只是一个空对象: {}

我已经搜索了其他示例以了解如何正确执行此操作。我在 DigitalOcean中找到了一个教程,它们也在@BodyPOST 请求中使用;他们在教程的结尾留下了一个带有示例的存储库。这个例子既不适合我。

我只是addBook()book.service.ts档案中的功能做了一个小改动,用于返还新书而不是所有书

addBook(book): Promise<any> {
    return new Promise(resolve => {
        this.books.push(book);
        // resolve(this.books);
        resolve(book);
    });
}
Run Code Online (Sandbox Code Playgroud)

我从 Postman 执行以下 POST 请求,但响应是一个空对象。

来自邮递员的 POST 请求

除了 POST 请求之外,所有其他 HTTP 请求都运行良好。

任何想法代码可能有什么问题?提前致谢。

Jay*_*iel 19

您正在发送form-data默认情况下 NestJS 未正确解析的内容。您可以使用application/x-www-url-form-encodedapplication/jsonrawPostman 中的选项一起使用。JSON 正文如下所示:

{
  "id": "7",
  "title": "Whatever Title",
  "desscription": "whats doc",
  "author": "Me"
}
Run Code Online (Sandbox Code Playgroud)

然后您的服务器将正确识别身体。另一种选择是添加一个正确解析表单数据的正文解析器。有几个选项有像multerform-parserformidable,等。


小智 7

与示例无关,但与标题相关。

\n

如果您在应用程序上使用 ValidationPipe 并设置whitelist=true。

\n
app.useGlobalPipes(new ValidationPipe({ whitelist: true }));\n
Run Code Online (Sandbox Code Playgroud)\n

白名单 \xe2\x80\x94 删除不属于 DTO 的查询的任何属性。

\n

并且不要在 DTO 对象上使用“类验证器”中的装饰器

\n
import { IsNotEmpty, MaxLength } from \'class-validator\';\n\nexport class Cat {\n  @MaxLength(200)\n  @IsNotEmpty()\n  name: string;\n\n  age: number; // would be removed by ValidationPipe when whitelist=true\n}\n
Run Code Online (Sandbox Code Playgroud)\n

这些属性将被删除。你会得到空的对象。

\n