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.

Los validadores de clase no funcionan cuando el tipo es un Record en NestJS.

Tenemos una propiedad DTO donde su tipo es <code>Record<string, Animal></code> y <code>Animal</code> es otro DTO con validadores de clase como @IsDefined(), @IsNotEmpty(). Sin embargo, estas validaciones no están funcionando como se esperaba y probablemente sea debido al tipo Record.

Ya he intentado agregar <code>@ValidatedNested({ each: true })</code> pero aun así no funcionó. ¿Cómo podríamos hacer que la validación funcione para el DTO Animal en <code>Record<string, Animal></code>?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Es posible que los validadores de clase como @IsDefined() y @IsNotEmpty() no estén funcionando como se espera debido al tipo Record. Una solución podría ser utilizar un validador personalizado que se encargue de validar el DTO Animal dentro de Record. Puedes crear un validador personalizado que iterará a través de Record y validar cada DTO Animal utilizando class-validator.

    Aquí tienes un ejemplo de cómo puedes crear un validador personalizado:

    import { ValidatorConstraint, ValidatorConstraintInterface, ValidationArguments } from 'class-validator';
    import { Animal } from './animal.dto';
    
    @ValidatorConstraint({ name: 'custom' })
    export class AnimalRecordValidator implements ValidatorConstraintInterface {
      validate(records: Record<string, animal="">, validationArguments?: ValidationArguments): boolean {
        for(const key in records) {
          const animal = records[key];
          const errors = await validate(animal);
    
          if(errors.length > 0) {
            return false;
          }
        }
    
        return true;
      }
    
      defaultMessage(validationArguments?: ValidationArguments): string {
        return 'Invalid Animal DTO';
      }
    }
    

    En el validador anterior, estamos iterando a través de Record, validando cada DTO Animal y devolviendo true si todos los DTO pasan la validación. Luego puedes utilizar este validador personalizado en tu clase DTO de la siguiente manera:

    import { IsDefined, IsNotEmpty, ValidateNested } from 'class-validator';
    import { Animal } from './animal.dto';
    import { AnimalRecordValidator } from './custom.validator';
    
    export class RecordDto {
      @IsDefined()
      @IsNotEmpty()
      @ValidateNested({ each: true })
      @Validator(AnimalRecordValidator)
      record: Record<string, animal="">;
    }
    

    Al agregar @Validator(AnimalRecordValidator) al DTO, aseguras que el validador personalizado se utilice para validar el DTO Animal.</string,></string,>

Comments are closed.