Saltar al contenido

Esquema condicional del validador Joi

Tenemos la respuesta a esta duda, al menos eso creemos. Si sigues con alguna inquietud dínoslo y con gusto te ayudaremos

Solución:

Logré lo mismo de una manera un poco diferente. Publicando lo mismo aquí ya que esto podría ser útil para alguien en el futuro.

const schema = Joi.object(
    type: Joi.number().required().valid(1, 2, 3),
    firstname: Joi.alternatives().conditional('type',  is: 1, then: Joi.string().required() ),
    lastname: Joi.alternatives().conditional('type',  is: 1, then: Joi.string().required() ),
    salary: Joi.alternatives().conditional('type',  is: 2, then: Joi.number().required() ),
    pension: Joi.alternatives().conditional('type',  is: 2, then: Joi.number().required() ),
    credit: Joi.alternatives().conditional('type',  is: 3, then: Joi.number().required() ),
    debit: Joi.alternatives().conditional('type',  is: 3, then: Joi.number().required() ),
))

Esto estaba funcionando perfectamente como se esperaba.

Cuando el valor del tipo es 1 el objeto debe tener sólo type, firstname y lastname

Cuando el valor del tipo es 2 el objeto debe tener sólo type, salary y pension

Cuando el valor del tipo es 3 el objeto debe tener sólo type, credit y debit

Cualquier otra combinación se arrojará como error desde la capa de middleware del validador joi. También cualquier otro valor de tipo que no sea 1, 2 y 3 generará un error.

¡Esto funciona para mi!

var Joi = require('joi');

var schema = 
    a: Joi.any().when('b',  is: 5, then: Joi.required(), otherwise: Joi.optional() ),
    b: Joi.any()
;

var thing = 
    b: 5
;
var validate = Joi.validate(thing, schema);

// returns

    error: null,
    value: 
        b: 5
    

Esta es la referencia.

En la documentación parece switch es válida key para usar a lo largo alternatives.conditional. ¿Podrías intentar lo siguiente?

const schema = Joi.alternatives().conditional(Joi.object(
  type: 1
).unknown(), 
  switch: [
    is: 1,

    then: Joi.object(
      type: Joi.string(),
      firstname: Joi.string(),
      lastname: Joi.string(),
    ),
  , 
    is: 2,

    then: Joi.object(
      type: Joi.number(),
      salary: Joi.any(),
      pension: Joi.any(),
    ),
  , 
    // ...
  ],
);

EDITAR :

No pude encontrar ningún ejemplo en ninguna parte sobre el uso de la switch palabra clave…

Pero encontré otra forma de lograrlo en hapijs/joi github

const schema = Joi.object(
     a: Joi.number().required(),
     b: Joi.alternatives()
             .conditional('a', [
                  is: 0, then: Joi.valid(1) ,
                  is: 1, then: Joi.valid(2) ,
                  is: 2, then: Joi.valid(3), otherwise: Joi.valid(4) 
    ])
);

Si te sientes estimulado, tienes la libertad de dejar una reseña acerca de qué te ha parecido esta crónica.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *