Si tengo un esquema:
const schema = Joi.object({ title: Joi.string().trim().alphanum().min(3).max(50).required().messages({ "string.base": `Must be text`, "string.empty": `Cannot be empty`, "string.min": `Must be > 3`, "string.max": `Must be < than 50`, "any.required": `Required`, }), ... // more key/constraints });¿Es posible acceder al par clave/valor del objeto Joi para usarlo en una función para validar un campo individual?
Entonces, por ejemplo, podría hacer algo como esto:
const validateProperty = ({ value, name }, schema) => { const { error } = schema[name].validate(value); if(!error) return null; return error.details[0].message; }; validateProperty({value:valueToValidate, name:'title'}, schema) donde el name es la clave de la restricción en el esquema? Simplemente me ahorraría escribir un esquema para un formulario completo y luego volver a escribir cada restricción individual como su propio esquema para validar campos individuales cuando sea necesario (por ejemplo, onBlur)
Resulta que .extract() aquí fue la respuesta correcta, solo fue un error en mi implementación:
const validateProperty = ({ value, name }, schema) => { const { error } = schema.extract(name).validate(value); if(!error) return null; return error.details[0].message; }; const validate = (data, schema) => { const options = { abortEarly: false } const { error } = schema.validate(data, options); if(!error) return null; const errors = {}; error.details.forEach(error => { errors[error.path[0]] = error.message }) return errors; } validate(data, schema)
validateProperty({ value: valueToValidate, schema })