将验证管道与类验证器一起使用

时间:2018-07-26 23:55:29

标签: typescript nestjs class-validator

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

我有一个具有类验证器修饰符的DTO,它的行为符合预期。但是,我想利用'skipMissingProperties'忽略对不存在的事物的验证(例如屏幕快照中的'name')。

我的目的是拥有一个使用多个装饰器的简单DTO,并跳过对不存在的装饰器的验证。

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

如何将验证管道的skipMissingProperties选项与类验证器修饰符一起用于那些确实要传入的修饰符?

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

Validation Pipe on Controller Screenshot

UpdateViewDTO's decorators Screenshot

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    

       }

UpdateViewDTO:

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 
}

1 个答案:

答案 0 :(得分:0)

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


  app.useGlobalPipes(
    new ValidationPipe({
      skipMissingProperties: true,
      exceptionFactory: (errors: ValidationError[]) => {
        return new BadRequestException(errors[0].constraints);
      },
    }),
  );