NestJS中的键值对对象的ValidationPipe

时间:2020-11-11 08:30:01

标签: javascript typescript nestjs dto class-validator

我的NestJS控制器中有以下DTO对象,作为请求主体的一部分:

export class UserPropertiesDto {
  [key: string]: boolean;
}

例如:{campaignActive: true, metadataEnabled: false}

这是一个键值对object,其中键是唯一的string,其值是boolean

我想应用class-validator批注以确保正确的验证和转换,但是它一直显示错误Decorators are not valid here

export class UserPropertiesDto {
  @IsOptional()
  @IsString() // `key` should be a string
  @MaxLength(20) // `key` should have no more than 20 characters
  @IsBoolean() // `value` has to be a `boolean`
  [key: string]: boolean;
}

能否请您提供最佳方法建议

  • 确保保留所有对象的属性
  • 验证密钥以确保其字符串长度不超过20个字符
  • 验证值以确保它是boolean

2 个答案:

答案 0 :(得分:1)

我建议您注意custom validator。在验证过程中,它可以访问已验证对象的所有属性和值。

您可以将所有验证参数作为第二个参数传递,并在验证器中使用它们来控制流。

y={ndarray:(1400,)}

答案 1 :(得分:1)

我建议您使用自定义验证程序,我试图为您做一些工作:

iskeyvalue-validator.ts

   import { ValidatorConstraint, ValidatorConstraintInterface, 
 ValidationArguments } 
 from 
  "class-validator";
   import { Injectable } from '@nestjs/common';

  @Injectable()
  @ValidatorConstraint({ async: true })
  export class IsKeyValueValidate implements ValidatorConstraintInterface {



    async validate(colmunValue: Object, args: ValidationArguments) {
      try {
         if(this.isObject(colmunValue))
              return false; 

       var isValidate = true;
       Object.keys(colmunValue)
       .forEach(function eachKey(key) {  
          if(key.length > 20 || typeof key  != "string" || typeof colmunValue[key] != 
        "boolean")
          {
            isValidate = false;
          }
        });
       return isValidate ;


        } catch (error) {
     console.log(error);
      } 

       }

isObject(objValue) {
return objValue && typeof objValue === 'object' && objValue.constructor === Object;
   }

    defaultMessage(args: ValidationArguments) { // here you can provide default error 
      message if validation failed
     const params = args.constraints[0];
  if (!params.message)
     return `the ${args.property} is not validate`;
  else
     return params.message;
   }
   }

要实现它,您必须在模块提供程序中添加IsKeyValueValidate:

providers: [...,IsKeyValueValidate],

并在您的Dto中:

   @IsOptional()
  @Validate(IsKeyValueValidate, 
    [ { message:"Not valdiate!"}] )
  test: Object;