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.