Канал проверки в NestJS для объекта пары ключ-значение

#javascript #typescript #nestjs #dto #class-validator

#javascript #typescript #nestjs #dto #класс-валидатор

Вопрос:

У меня есть следующий объект DTO в моем контроллере NestJS как часть тела запроса:

 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

Ответ №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 amp;amp; typeof objValue === 'object' amp;amp; 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;
  

Комментарии:

1. Спасибо! С некоторыми незначительными изменениями он работал хорошо. К сожалению, это не допускает строгих типов, но это нормально.

Ответ №2:

Я бы посоветовал обратить внимание на пользовательский валидатор. Во время проверки он имеет доступ ко всем свойствам и значениям проверяемого объекта.

Все аргументы проверки вы можете передать в качестве второго параметра и использовать их внутри validator для управления потоком.

 export class Post {
 
    @Validate(CustomTextLength, {
        keyType: String,
        maxLength: 20
       ...
    })
    title: string;
 
}