Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

358
Visualizações
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 Respostas
Responde à pergunta

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda