2

我试图弄清楚如何在 API 调用中正确使用我的验证管道和类验证器。

我有一个带有类验证器装饰器的 DTO,其行为符合预期。但是,我想利用“skipMissingProperties”来忽略对不存在的东西的验证(例如屏幕截图中的“名称”)。

我的意图是能够拥有一个使用许多装饰器的简单 DTO,并跳过对那些不存在的装饰器的验证。

不幸的是,我对 skipMissingProperties 的使用似乎不正确,因为提供此选项仍然会从 DTO 中引发验证错误。

我如何使用验证管道 skipMissingProperties 选项以及类验证器装饰器来处理那些确实传入的装饰器?

使用以下代码,如果我使用其他参数发出更新请求,但从正文中排除“名称”,则类验证器会从 DTO 级别引发错误。

控制器屏幕截图上的验证管道

UpdateViewDTO 的装饰器截图

API 控制器端点:

    @Put(':viewId')
    public async updateView(
        @Req() request: RequestExtended,
        @Param('viewId') viewId: string,
        @Body(new ValidationPipe({ skipMissingProperties: true })) updateView: UpdateViewDto)
        : Promise<View> {

        // Do some API stuff    

       }

更新视图DTO:

export class UpdateViewDto {
    @IsString()
    @MinLength(1, {
        message: LanguageElements.VIEW_NAME_REQUIRED_ERROR_MSG,
    })
    @MaxLength(50, {
        message: LanguageElements.VIEW_NAME_TOO_LONG_ERROR_MSG,
    })
    public readonly name?: string;

    // Other properties 
}
4

1 回答 1

1

在您的 ValidationPipe 中main.ts,您可以直接添加。skipMissingProperties: true


  app.useGlobalPipes(
    new ValidationPipe({
      skipMissingProperties: true,
      exceptionFactory: (errors: ValidationError[]) => {
        return new BadRequestException(errors[0].constraints);
      },
    }),
  );
于 2019-12-13T19:31:56.480 回答