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.
davy.ai
Basándonos en el código compartido, parece que estás tratando de usar el decorador validador condicional
@ValidateIf
declass-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 devuelveverdadero
. En tu código, estás usando el parámetroo
para acceder a la variableotherProperty
, que está configurada con el valor deprocess.env.AMOUNT_CHECK_IN_MODE
.Para lograr el comportamiento deseado, puedes modificar los decoradores
@ValidateIf
de la siguiente manera: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 siotherProperty
está configurado enTEST
, solo se ejecutarán el decorador@Max
y el primer decorador@IsNumberString
, mientras que si está configurado enLIVE
, solo se ejecutará el segundo decorador@IsNumberString
.¡Espero que esto ayude! Hazme saber si tienes alguna otra pregunta.