Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

348
Views
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 answers
Answer question

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!