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 usar el validador de clase (@ValidateIf) con validación condicional basada en el valor de la variable de entorno.

Estoy tratando de usar el decorador de validación condicional @ValidateIf de class-validator basado en el valor de una variable de entorno. Permítame compartir el código para una mejor comprensión:

// Entrada del archivo .env

AMOUNT_CHECK_IN_MODE=TEST

En mi archivo validador (.dto), tengo el siguiente código colocado

import {
IsNumberString,
Max,
ValidateIf
} from ‘class-validator’;

export class GtTransactionDto {
otherProperty: string;
constructor() {
this.otherProperty = process.env.AMOUNT_CHECK_IN_MODE;
}

@ValidateIf(o => o.otherProperty === ‘TEST’)
@Max(1, {
message: ‘El monto no debe exceder 1’,
context: {
code: GtTransactionErrorCode.validate.DestinationAmount
},
})
@ValidateIf(o => o.otherProperty === ‘LIVE’)
@IsNumberString(
{},
{
message: ‘Este no es un número $property válido’,
context: {
code: GtTransactionErrorCode.validate.DestinationAmount,
},
}
)
@ValidateIf(o => o.otherProperty === ‘TEST’)
@IsNumberString(
{},
{
message: ‘Este no es un número $property válido’,
context: {
code: GtTransactionErrorCode.validate.DestinationAmount,
},
}
)
destinationAmount!: string;
}

Quiero asegurarme de que si se establece TEST como el valor de AMOUNT_CHECK_IN_MODE en el archivo .env, entonces la validación para el monto máximo y isNumberString debe ejecutarse. Sin embargo, si se establece el valor en LIVE, entonces solo se debe ejecutar la validación para isNumberString.

Se agradecería cualquier ayuda.

Tags:  ,

Answer

  1. Avatar for davy.ai

    Basándonos en el código compartido, parece que estás tratando de usar el decorador validador condicional @ValidateIf de class-validator basado en el valor de una variable de entorno.

    El decorador @ValidateIf toma una función que devuelve un valor booleano. La validación solo se ejecutará si la función devuelve verdadero. En tu código, estás usando el parámetro o para acceder a la variable otherProperty, que está configurada con el valor de process.env.AMOUNT_CHECK_IN_MODE.

    Para lograr el comportamiento deseado, puedes modificar los decoradores @ValidateIf de la siguiente manera:

    @ValidateIf(o => o.otherProperty === 'TEST')
    @Max(1, {
      message: 'Amount should not exceed 1',
      context: {
        code: GtTransactionErrorCode.validate.DestinationAmount
      },
    })
    @ValidateIf(o => o.otherProperty === 'LIVE', { each: false })
    @IsNumberString(
      {},
      {
        message: 'This is not a valid $property number',
        context: {
          code: GtTransactionErrorCode.validate.DestinationAmount,
        },
      }
    )
    destinationAmount!: string;
    

    Aquí, estás usando la opción each del decorador @ValidateIf para especificar que la validación solo se debe ejecutar una vez, independientemente de la cantidad de decoradores usados. Esto asegura que si otherProperty está configurado en TEST, solo se ejecutarán el decorador @Max y el primer decorador @IsNumberString, mientras que si está configurado en LIVE, solo se ejecutará el segundo decorador @IsNumberString.

    ¡Espero que esto ayude! Hazme saber si tienes alguna otra pregunta.

Comments are closed.