NestJs一个具有关系的Post请求

NestJs一个具有关系的Post请求,nestjs,Nestjs,在我的NestJs应用程序中,我有两个实体:person.entity.ts和property.entity.ts,这两个实体通过一对一的关系连接。我已经为个人和财产创建了DTO 关系的拥有方是这样定义的: @JoinColumn() @OneToMany( (type) => PersonProperties, (personProperties) => personProperties.person, { cascade: ['insert', '

在我的NestJs应用程序中,我有两个实体:
person.entity.ts
property.entity.ts
,这两个实体通过一对一的关系连接。我已经为个人和财产创建了DTO

关系的拥有方是这样定义的:

  @JoinColumn()
  @OneToMany(
    (type) => PersonProperties,
    (personProperties) => personProperties.person,
    { cascade: ['insert', 'update'] },
  )
  personProperties: PersonProperties[];
 @Post()
  async create(@Body() createPersonDto: CreatePersonDto) {
    return this.personService.create(createPersonDto);
  }
我的用于发布新人的控制器如下所示:

  @JoinColumn()
  @OneToMany(
    (type) => PersonProperties,
    (personProperties) => personProperties.person,
    { cascade: ['insert', 'update'] },
  )
  personProperties: PersonProperties[];
 @Post()
  async create(@Body() createPersonDto: CreatePersonDto) {
    return this.personService.create(createPersonDto);
  }
对于验证,我使用全局验证管道,如下所示:

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  app.useGlobalPipes(
    new ValidationPipe({
      whitelist: true,
      forbidNonWhitelisted: true,
      transform: true,
      transformOptions: {
        enableImplicitConversion: true,
      },
    }),
  );

我应该如何修改我的代码,以便通过一个请求发布(和验证)一个人的属性?这不是将一个DTO包含在另一个DTO中吗?

您必须使用的是管道

在您的情况下,需要一个验证管道来根据DTO验证传入的请求

管道在控制器内部使用,不过您可以阅读有关创建自定义管道的内容。内置
ValidationPipe
现在可以满足您的需要。
方法1

 @Post()
  async create(@Body(ValidationPipe) createPersonDto: CreatePersonDto) {
    return this.personService.create(createPersonDto);
  }
方法2

  @Post()
    @UsePipes(ValidationPipe)
          async create(@Body() createPersonDto: CreatePersonDto) {
            return this.personService.create(createPersonDto);
          }
这两种方法基本上做相同的事情。它接受您的Body请求对象,并根据定义的DTO对其进行验证


希望这能回答您的问题。

您必须使用的是管道

在您的情况下,需要一个验证管道来根据DTO验证传入的请求

管道在控制器内部使用,不过您可以阅读有关创建自定义管道的内容。内置
ValidationPipe
现在可以满足您的需要。
方法1

 @Post()
  async create(@Body(ValidationPipe) createPersonDto: CreatePersonDto) {
    return this.personService.create(createPersonDto);
  }
方法2

  @Post()
    @UsePipes(ValidationPipe)
          async create(@Body() createPersonDto: CreatePersonDto) {
            return this.personService.create(createPersonDto);
          }
这两种方法基本上做相同的事情。它接受您的Body请求对象,并根据定义的DTO对其进行验证


希望这能回答您的问题。

解决方案是创建一个复合DTO对象,如下所示:

export class CreatePersonWithPropertiesDto {
  @ValidateNested()
  @Type(() => CreatePersonDto)
  neuron: CreatePersonDto;

  @IsOptional()
  @ValidateNested({ each: true })
  @Type(() => CreatePersonPropertiesDto)
  personProperties?: CreatePersonPropertiesDto[];
}
然后调整控制器以期望复合DTO:

@Post()
  async create(@Body() createPersonWithPropertiesDto: CreatePersonWithPropertiesDto) {
    return this.personService.create(createPersonWithPropertiesDto);
  }

解决方案是创建一个复合DTO对象,如下所示:

export class CreatePersonWithPropertiesDto {
  @ValidateNested()
  @Type(() => CreatePersonDto)
  neuron: CreatePersonDto;

  @IsOptional()
  @ValidateNested({ each: true })
  @Type(() => CreatePersonPropertiesDto)
  personProperties?: CreatePersonPropertiesDto[];
}
然后调整控制器以期望复合DTO:

@Post()
  async create(@Body() createPersonWithPropertiesDto: CreatePersonWithPropertiesDto) {
    return this.personService.create(createPersonWithPropertiesDto);
  }

感谢您的回答,但实际上它并没有回答我的问题,请注意,我确实使用ValidationPipe作为全局管道。我在这里感到困惑的是,我基本上有两个DTO发布在一起,一个用于个人,另一个用于财产。您能否显示一些代码或更具体地说明您试图实现的目标。我不认为我完全理解您想要做什么。如果我没有错,您打算做的是根据
个人属性
DTO验证personProperties??是吗?这是正确的,它与POST/person REST请求一起发布。我想这是一个很常见的要求。您是否尝试过使用单独的验证管道??````@Body('personProperties',ValidationPipe)personProperties,@Body()…)首先检查您的Body中是否有personProperties,并将其与personProperties数据库进行匹配以获得答案,但实际上它并没有回答我的问题,请注意,我确实使用ValidationPipe作为全局管道。我在这里感到困惑的是,我基本上有两个DTO发布在一起,一个用于个人,另一个用于财产。您能否显示一些代码或更具体地说明您试图实现的目标。我不认为我完全理解您想要做什么。如果我没有错,您打算做的是根据
个人属性
DTO验证personProperties??是吗?这是正确的,它与POST/person REST请求一起发布。我想这是一个很常见的要求。您是否尝试过使用单独的验证管道??````@Body('personProperties',ValidationPipe)personProperties,@Body()..)首先检查您的Body中的personProperties,并将其与您的personProperties Dto进行匹配