Aquí hay un enlace al ejemplo de codesandbox (Svelte) . Representa un registro trivial de ser validado con Joi . El problema al que me enfrento es al borrar los mensajes de error de validación de Joi. Los estoy grabando en el objeto de errors , claves nombradas por el nombre de entrada ( email , password , passwordConfirm ).
Las validaciones ocurren a través de la función adjunta al formulario on:input
const validate = async e => { const fields = { [e.target.name]: e.target.value }; try { errors[Object.keys(fields)[0]] = null; await registerSchema.validateAsync( { ...fields }, { abortEarly: false, allowUnknown: true } ); } catch (err) { errors[Object.keys(fields)[0]] = err; } }; Es crudo, pero en su mayoría funciona. Borra bien los errores de email y password , pero haga lo que haga, la confirmación de passwordConfirm persiste.
No creo que el problema sea con mi esquema Joi:
export const registerSchema = Joi.object({ email: Joi.string().email({ tlds: { allow: false } }), password: Joi.string().pattern(new RegExp("^[a-zA-Z0-9]{6,30}$")).trim(), passwordConfirm: Joi.string().valid(Joi.ref("password")).trim() }); Estoy bastante seguro de que el error se esconde en algún lugar de la función de validate en sí, pero, por mi muerte, puedo encontrarlo. Apreciaría un par de pistas aquí.
De hecho, su problema está en su función de validación. Cuando construye su objeto de fields , la única clave que le agrega es la entrada actualmente activa: const fields = { [e.target.name]: e.target.value }; , lo que significa que cuando comparas passwordConfirm con Joi.ref('password') en tu esquema, este último siempre es un valor vacío porque no hay una clave de password en el objeto que se está validando.
Una forma (cruda) de evitarlo es asegurarse de que el campo de password se pase al objeto que se valida cuando la entrada activa es passwordConfirm :
const validate = async e => { const fields = { [e.target.name]: e.target.value }; if (e.target.name === 'passwordConfirm') { fields.password = password; } // console.log(fields); // log object being validated try { errors[Object.keys(fields)[0]] = null; await registerSchema.validateAsync( { ...fields }, { abortEarly: false, allowUnknown: true } ); } catch (err) { errors[Object.keys(fields)[0]] = err; } };Probado en su CodeSandbox y parecía funcionar según lo previsto.