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 joiExemplo 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 yupExemplo 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
Também na biblioteca
Geração de QR Codes em C++: biblioteca QR-Code-generator
Envio de SMS em Java: Visão geral e exemplos de uso de bibliotecas API (Twilio, Nexmo)
bcrypt em Go: guia completo com exemplos práticos
Validação de dados em JavaScript (Node.js): Joi, Yup, Zod