如果字段可以为空,则验证期间的装饰器仍然有效

Posted

技术标签:

【中文标题】如果字段可以为空,则验证期间的装饰器仍然有效【英文标题】:decorators during validation still work if the field is nullable 【发布时间】:2021-02-16 07:40:17 【问题描述】:

我使用 class-validator 。 但是在阅读了这个包的文档和一般graphql之后,我仍然没有找到如何解决这个问题

有这个突变:

@Mutation(() => UserEntity)
  async updateUserById(
    @Args('id') id: string,
    @Args('inputs') inputs: UpdateUserDto
  )
    : Promise<UserEntity> 
    return await this.userService.updateUserById(id, inputs)
  

我的 Dto 看起来像:

@InputType()
export class UpdateUserDto 

  @Field(nullable: true)
  @IsString()
  fullName?: string;

  @Field(nullable: true)
  @IsEmail()
  @IsString()
  email?: string;

  @Field(nullable: true, description: 'Password must be longer than or equal to 5 characters')
  @MinLength(5)
  @IsString()
  password?: string;

  @Field(nullable: true)
  @IsString()
  phoneNumber?: string

当我想更新一个字段时:

mutation
  updateUserById(id:"847025d8-0e6f-4456-88f7-710b104db6ca", 
    inputs:
    fullName:"New name"
  )
  
    fullName
  

即使该字段可以为空,仍然会从工作中的装饰器中收到错误:

"errors": [
    
      "message": 
        "statusCode": 400,
        "error": "Bad Request",
        "message": [
          
            "target": 
              "fullName": "New name"
            ,
            "constraints": 
              "isString": "email must be a string",
              "isEmail": "email must be an email"
            
          ,

如何解决?

【问题讨论】:

【参考方案1】:

通过添加@IsOptional()装饰器解决

【讨论】:

以上是关于如果字段可以为空,则验证期间的装饰器仍然有效的主要内容,如果未能解决你的问题,请参考以下文章

测试包装 api 路由的装饰器

Zend Form reCaptcha ViewScript 装饰器

如何在没有守卫装饰器的情况下始终验证 JWT? (Nest.js + 护照)

如何使用类验证器装饰器比较 graphql 类型的输入类型中的字段

搭建node服务:Decorator装饰器

解决使用@wraps装饰器,但是仍然未消除装饰器产生的副作用问题