Validação de dados em Node.js com Joi: guia completo

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 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 joi


Exemplo 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

Recommendations