【问题标题】:NestJs one Post request with relationNestJs 一个具有关系的 Post 请求
【发布时间】:2021-05-05 17:51:31
【问题描述】:

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

关系的拥有方在 Person 中定义如下:

  @JoinColumn()
  @OneToMany(
    (type) => PersonProperties,
    (personProperties) => personProperties.person,
    { cascade: ['insert', 'update'] },
  )
  personProperties: PersonProperties[];

用于发布新 Person 的控制器如下所示:

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

对于验证,我使用 Global ValidationPipes 如下:

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

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

【问题讨论】:

    标签: nestjs


    【解决方案1】:

    你必须使用的是管道Read more about it

    在您的情况下,需要验证管道来根据您的 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 对其进行验证。

    希望这能回答你的问题。

    【讨论】:

    • 感谢您的回答,但实际上它并没有回答我的问题,请注意我确实使用 ValidationPipe 作为全局管道。我在这里感到困惑的是,我基本上有两个 DTO 一起发布,一个用于 Person,一个用于 Property。
    • 您能否展示一些代码或更具体地说明您想要实现的目标。我不认为我完全理解你想要做什么。
    • 如果我没记错的话,您打算根据person properties DTO 验证 personProperties 吗?是这样吗?
    • 没错,与 POST /person REST 请求一起发布。我猜这是一个很常见的要求。
    • 您是否尝试过使用单独的验证管道? ```...@Body('personProperties' , ValidationPipe) personProperties, @Body()..) 这首先检查你的 body 中的 personProperties 并将它与你的 personProperties Dto 匹配
    【解决方案2】:

    解决方法是创建复合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);
      }
    

    【讨论】:

      猜你喜欢
      • 2020-07-13
      • 2019-01-29
      • 1970-01-01
      • 2012-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-13
      相关资源
      最近更新 更多