您如何称呼以下函数签名中的“@Body()”:"create(@Body() createCatDto: CreateCatDto) {}" in typescript/nestjs

What do you call the "@Body()" in the following function signature: "create(@Body() createCatDto: CreateCatDto) {}" in typescript/nestjs

我正在尝试学习 NestJS,我注意到它们 documentation 上的以下函数签名:

@Post()
async create(@Body() createCatDto: CreateCatDto) {
  this.catsService.create(createCatDto);
}

第一次看到参数名前的@Body()。它是什么?你怎么称呼它?它看起来像一个装饰器,但感觉它以某种方式转换了参数,但我认为这就是参数类型的意义所在吧?

此致,

这些被称为参数装饰器你可以进一步阅读这个以获得更好的解释 https://docs.nestjs.com/custom-decorators#param-decorators

针对您的问题@Body() 是一个参数装饰器,它将您传入的 JSON 有效负载解析为 Dto (数据传输对象) 提供的结构(Dto 可以是一个 class 或者可以是一个接口)。

例如假设以下 Dto 结构:

export class CreateCatDto {
  name: string;
  age: number;
  breed: string;
}

此结构期望 client-side 传递以下结构 JSON

{
 "name" : "abc",
 "age"  : 22,
 "breed" : "abc"

}

然后 @Body() 参数装饰器将传入的 JSON 有效负载解析为提供的 Dto。

因此,您可以简单地以 class 对象或界面的形式获得 JSON 值,如下所示:

@Post()
async create(@Body() createCatDto: CreateCatDto) {
  console.log(createCatDto.name);
  console.log(createCatDto.age);
  console.log(createCatDto.breed);
  this.catsService.create(createCatDto);
}

注意:任何参数缺失都会导致Dto中未定义。