Validação de dados em Node.js com Joi
Em aplicações web modernas em Node.js, a validação de dados é uma etapa criticamente importante no processamento de requisições. Erros nos dados podem levar a vulnerabilidades, mau funcionamento ou queda do servidor. Uma das bibliotecas mais poderosas e populares para essa tarefa é o Joi (pronuncia-se "joi"). Ela permite descrever esquemas de dados e verificar sua conformidade com regras definidas.
O que é Joi?
Joi é uma biblioteca para descrição de esquemas e validação de objetos JavaScript. Ela é especialmente popular no ecossistema Node.js, onde é frequentemente usada junto com Express, Hapi ou Fastify. Joi fornece uma API simples e expressiva para definir tipos, campos obrigatórios, intervalos, expressões regulares e verificações personalizadas.
Instalação
Instalação do Joi via npm:
npm install joiExemplo básico
Vamos criar um esquema para validar dados de usuário:
const Joi = require('joi');
const schema = Joi.object({ username: Joi.string() .alphanum() .min(3) .max(30) .required(), password: Joi.string() .pattern(new RegExp('^[a-zA-Z0-9]{3,30}$')), email: Joi.string() .email({ minDomainSegments: 2, tlds: { allow: ['com', 'net'] } })});
const data = { username: 'user123', password: 'pass123', email: 'user@example.com'};
const { error, value } = schema.validate(data);
if (error) { console.log('Erro de validação:', error.details);} else { console.log('Dados válidos:', value);}Principais métodos e regras
Joi suporta diversos tipos e modificadores:
- Tipos de dados:
Joi.string(),Joi.number(),Joi.boolean(),Joi.date(),Joi.array(),Joi.object(). - Obrigatoriedade:
.required()— campo obrigatório. - Restrições:
.min(),.max(),.length()— para strings e arrays. - Expressões regulares:
.pattern(regex)— verificação por padrão. - Email e URL:
.email(),.uri()— validadores embutidos. - Mensagens personalizadas:
.messages()— substituição de erros padrão.
Validação de objetos e arrays aninhados
Joi lida muito bem com estruturas complexas:
const addressSchema = Joi.object({ street: Joi.string().required(), city: Joi.string().required(), zip: Joi.string().pattern(/^\\d{5}$/)});
const userSchema = Joi.object({ name: Joi.string().required(), age: Joi.number().integer().min(18).max(120), addresses: Joi.array().items(addressSchema).min(1)});
const userData = { name: 'Ana', age: 25, addresses: [ { street: 'Nevsky pr.', city: 'SPb', zip: '191011' } ]};
const result = userSchema.validate(userData);console.log(result.error ? result.error.details : 'OK');Tratamento de erros
Em caso de erro de validação, Joi retorna o objeto error.details — um array com a descrição detalhada de cada erro:
if (result.error) { result.error.details.forEach(detail => { console.log(`Campo: ${detail.path.join('.')}, mensagem: ${detail.message}`); });}Uso com Express
Joi é frequentemente usado em middleware para validar requisições:
const express = require('express');const Joi = require('joi');const app = express();
app.use(express.json());
const validateUser = (req, res, next) => { const schema = Joi.object({ name: Joi.string().required(), email: Joi.string().email().required() }); const { e Também na biblioteca
Rate Limiting em Go (Golang): bibliotecas, padrões e exemplos de implementação
Event Bus e padrão Observer em Go (Golang): implementação e exemplos
Ktor Client Kotlin: guia completo com exemplos práticos
Geração de relatórios PDF em Rust: biblioteca printpdf
Agendador de Tarefas em C# (.NET): Quartz.NET, Hangfire, Coravel