es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo validar el nombre de propiedad dinámica en una API REST en una aplicación de nest.js?

La tarea es validar carga útil en una aplicación nest.js antes de procesarla.
Cada carga útil puede contener objetos de etiquetas (1-11).
Cada objeto de etiqueta solo puede tener una propiedad y valor (propiedad determinada por la solicitud).

Los objetos de etiquetas deben ser validados:

  • La propiedad debe ser una cadena con cualquier carácter excepto : y tamaño de 1-255.
  • El valor debe ser una cadena con tamaño de 1-255.

La tarea parece simple. Pero no tengo idea de cómo validar propiedades construidas dinámicamente en objetos de etiquetas.

Los DTO son (validación configurada usando class-validator):

import {
  ArrayMaxSize,
  ArrayMinSize,
  IsArray,
  IsDefined,
  IsNotEmpty,
  IsObject,
  IsString,
  Matches,
  MinLength,
  ValidateNested,
} from 'class-validator';

export class Payload {
...
  @IsArray()
  @ArrayMinSize(1)
  @ArrayMaxSize(11)
  @ValidateType(() => Tag)
  @ValidateNested()
  @ApiProperty()
  tags: Tag[];
}

Para hacer que `Tag` sea flexible (porque el nombre de la propiedad es desconocido) se creó como una extensión de `Map`.

export class Tag extends Map<string, string="">{
}

o un objeto de campo único

export class Tag {
}

¿Cómo gestionar la validación requerida para cada etiqueta?

(La expresión regular que excluye la entrada con : es /^[^:]+$/ y debe aplicarse para la clave)</string,>

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para validar los objetos Tag, se puede utilizar la librería class-validator. Se puede crear un validador personalizado para los objetos Tag y usar el decorador @ValidateType para aplicar el validador al arreglo tags. El validador personalizado deberá verificar que la clave (key) sea una cadena de texto con una longitud entre 1 y 255 caracteres, y que no contenga el caracter :. El valor (value) debe ser una cadena de texto con una longitud entre 1 y 255 caracteres. La expresión regular que excluye la entrada con : es /^[^:]+$/.

    Por ejemplo:

    import {
      ArrayMaxSize,
      ArrayMinSize,
      IsArray,
      IsDefined,
      IsNotEmpty,
      IsObject,
      IsString,
      Matches,
      MinLength,
      ValidateNested
    } from 'class-validator';
    
    export class Tag {
      @IsString()
      @MinLength(1)
      @MaxLength(255)
      @Matches(/^[^:]+$/)
      key: string;
    
      @IsString()
      @MinLength(1)
      @MaxLength(255)
      value: string;
    }
    
    export class Payload {
    ...
      @IsArray()
      @ArrayMinSize(1)
      @ArrayMaxSize(11)
      @ValidateType(() => Tag)
      @ValidateNested()
      @ApiProperty()
      tags: Tag[];
    }
    

Comments are closed.