Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

355
Vistas
Validación de formulario Joi: eliminación de errores mostrados

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í.

Nuevamente, el ejemplo se puede ver en codesandbox.

about 4 years ago · Juan Pablo Isaza
1 Respuestas
Responde la pregunta

0

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.

about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda