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.

Validar objeto de arreglo – Swagger/NestJS

Me pregunto si hay alguna forma de crear un DTO para validar un arreglo de objetos.

Ejemplo de arreglo:

[
  {
    "name": "Tag 1",
    "description": "Esta es la primera etiqueta"
  },
  {
    "name": "Tag 2",
    "description": "Esta es la segunda etiqueta"
  }
]

Por el momento tengo esto, y aunque funciona, no es lo que necesito.

export class Tags {
  @ApiProperty({
    description: 'El nombre de la etiqueta',
    example: 'Tag 1',
    required: true
  })
  @IsString()
  @MaxLength(30)
  @MinLength(1)
  name: string;

  @ApiProperty({
    description: 'La descripción de la etiqueta',
    example: 'Esta es la primera etiqueta',
    required: true
  })
  @IsString()
  @MinLength(3)
  description: string;
}

export class CreateTagDto {
  @ApiProperty({ type: [Tags] })
  @Type(() => Tags)
  @ArrayMinSize(1)
  @ValidateNested({ each: true })
  tags: Tags[];
}
Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Sí, hay una forma de crear un DTO para validar un arreglo de objetos. Simplemente puedes crear un DTO de arreglo de objetos y agregar los decoradores de validación necesarios a las propiedades de los objetos. Por ejemplo, considerando tu DTO actual de Tags, puedes modificar tu CreateTagDto de la siguiente manera:

    export class CreateTagDto {
      @ApiProperty({ type: [Tags] })
      @Type(() => Tags)
      @ArrayMinSize(1)
      @ValidateNested({ each: true })
      tags: Tags[];
    }
    
    export class TagsArrayDto {
      @ApiProperty({ type: [CreateTagDto] })
      @Type(() => CreateTagDto)
      @ArrayMinSize(1)
      @ValidateNested({ each: true })
      tagArr: CreateTagDto[];
    }
    

    Luego, puedes utilizar este TagsArrayDto para validar un arreglo de objetos:

    const tagsArray: TagsArrayDto = {
      tagArr: [
        {
          tags: [
            {
              name: 'Tag 1',
              description: 'Esta es la primera etiqueta',
            },
            {
              name: 'Tag 2',
              description: 'Esta es la segunda etiqueta',
            },
          ],
        },
      ],
    };
    
    const errors: ValidationError[] = await validateSync(tagsArray);
    
    if (errors.length > 0) {
      console.log('Falló la validación. Errores:', errors);
    } 
    

    Este ejemplo asegura que la propiedad tagArr sea un arreglo de al menos un objeto, y cada objeto en el arreglo tenga un arreglo de al menos una etiqueta, donde cada objeto de etiqueta tenga un nombre con una longitud máxima de 30 y una longitud mínima de 1, y una descripción con una longitud mínima de 3.

    Si tu caso de uso requiere una validación más compleja, puedes agregar decoradores adicionales a las propiedades del DTO o crear una función de validación personalizada.

Comments are closed.