Validação de dados em JavaScript (Node.js) com Joi e Yup

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Validação de dados em JavaScript (Node.js): Joi e Yup



Em qualquer aplicação web, especialmente em Node.js, uma das tarefas principais é verificar os dados de entrada. Sem validação, você corre o risco de obter erros no banco de dados, vulnerabilidades (SQL injection, XSS) ou comportamento incorreto do servidor. Neste artigo, veremos as duas bibliotecas de validação mais populares: Joi e Yup. Você aprenderá como instalá-las, criar esquemas e integrá-las com Express.



Por que a validação no servidor é necessária?

A validação no lado do cliente (HTML5 ou JavaScript no navegador) é conveniente, mas pode ser facilmente contornada. Portanto, a verificação no servidor é obrigatória. Ela garante que:

  • Os tipos de dados correspondem ao esperado (string, número, array).
  • Campos obrigatórios não estão vazios.
  • Os dados não excedem os tamanhos permitidos.
  • Os formatos (email, URL, telefone) são válidos.


Biblioteca Joi

Joi é um validador poderoso dos criadores do Hapi.js. Ele suporta esquemas complexos, mensagens de erro personalizadas e verificações assíncronas.



Instalação

npm install joi


Exemplo de esquema para registro de usuário

const Joi = require('joi');

const userSchema = Joi.object({ username: Joi.string() .alphanum() .min(3) .max(30) .required() .messages({ 'string.min': 'O nome de usuário deve ter no mínimo 3 caracteres', 'string.max': 'O nome de usuário não deve exceder 30 caracteres' }), email: Joi.string() .email({ tlds: { allow: false } }) .required(), password: Joi.string() .pattern(new RegExp('^[a-zA-Z0-9]{8,30}$')) .required(), birth_year: Joi.number() .integer() .min(1900) .max(2024)});

// Validaçãoapp.post('/register', (req, res) => { const { error, value } = userSchema.validate(req.body, { abortEarly: false }); if (error) { return res.status(400).json({ status: 'error', message: error.details.map(d => d.message).join(', ') }); } res.json({ status: 'success', data: value });});


Recursos avançados do Joi

  • Validação de arrays: Joi.array().items(Joi.string())
  • Regras condicionais: .when('role', { is: 'admin', then: Joi.required() })
  • Funções personalizadas: .custom((value, helpers) => { ... })


Biblioteca Yup

Yup é uma biblioteca leve e intuitiva, popular no ecossistema React (Formik). Mas também funciona muito bem no servidor.



Instalação

npm install yup


Exemplo de esquema para login

const yup = require('yup');

const loginSchema = yup.object().shape({ email: yup.string() .email('Insira um email válido') .required('Email é obrigatório'), password: yup.string() .min(8, 'A senha deve ter no mínimo 8 caracteres') .max(50) .required('Senha é obrigatória')});

// Middleware para Expressasync function validateLogin(req, res, next) { try { const validatedData = await loginSchema.validate(req.body, { abortEarly: false }); req.validatedData = validatedData; next(); } catch (err) { res.status(400).json({ status: 'error', errors: err.errors // array de mensagens de erro }); }}

app.post('/login', validateLogin, (req, res) => { res.json({ status: 'success', data: req.validatedData });});


Características do Yup

  • Validação assíncrona por padrão (retorna uma Promise).
  • Transformação de dados: .transform((value) => value.tr

Recommendations