Seu carrinho está vazio no momento!

Introdução (3 min)
Imagine um porteiro rigoroso em um evento exclusivo. Ele verifica os convites, garantindo que apenas os convidados com credenciais válidas entrem. A validação de dados em APIs funciona de maneira semelhante: ela assegura que as informações recebidas estejam no formato correto e atendam aos critérios definidos, protegendo sua aplicação de dados inválidos e potenciais problemas.
Em APIs modernas, a validação de dados é absolutamente essencial para garantir a integridade e a segurança dos seus sistemas. Nesta aula, vamos construir uma API simples com Node.js e Express, implementando validação de dados com três bibliotecas populares: Joi, Yup e express-validator.
Dentro do ecossistema Node.js/Express, a validação de dados reside entre o recebimento da requisição e o processamento da lógica de negócio, atuando como um filtro essencial.
Conceito Fundamental (7 min)
Validação de dados é o processo de verificar se as informações recebidas por uma aplicação estão de acordo com as regras predefinidas. Isso inclui verificar o tipo de dado (texto, número, data), o formato (e-mail, URL), o tamanho, valores permitidos, e outros critérios relevantes.
Termos como schema, sanitização e middleware são frequentes nesse contexto. Um schema define a estrutura e as restrições dos dados. Sanitização refere-se à limpeza e formatação dos dados antes da validação. Middleware são funções que interceptam as requisições e executam tarefas, como a validação.
Em produção, a validação é usada em formulários de cadastro, APIs REST, processamento de arquivos, e diversas outras situações. Ela se integra com bancos de dados, sistemas de autenticação e outras tecnologias para manter a consistência e a confiabilidade dos dados.
Validar dados oferece diversas vantagens: previne erros, melhora a segurança, simplifica a manutenção e aumenta a confiabilidade. A principal desvantagem é o pequeno overhead de processamento, porém insignificante comparado aos benefícios.
Implementação Prática (10 min)
const express = require('express');
const Joi = require('joi');
const { check, validationResult } = require('express-validator');
const yup = require('yup');
const app = express();
app.use(express.json()); // Importante para processar JSON
// Schema com Joi
const schemaJoi = Joi.object({
nome: Joi.string().required(),
idade: Joi.number().integer().min(18).required(),
email: Joi.string().email().required(),
});
// Schema com Yup
const schemaYup = yup.object().shape({
nome: yup.string().required(),
idade: yup.number().integer().min(18).required(),
email: yup.string().email().required(),
});
// Rota com Joi
app.post('/joi', (req, res) => {
const { error } = schemaJoi.validate(req.body);
if (error) return res.status(400).json({ error: error.details[0].message });
res.json({ mensagem: 'Dados válidos (Joi)' });
});
// Rota com express-validator
app.post('/express-validator', [
check('nome').notEmpty().withMessage('Nome é obrigatório'),
check('idade').isInt({ min: 18 }).withMessage('Idade deve ser um número inteiro maior ou igual a 18'),
check('email').isEmail().withMessage('Email inválido'),
], (req, res) => {
const errors = validationResult(req);
if (!errors.isEmpty()) {
return res.status(400).json({ errors: errors.array() });
}
res.json({ mensagem: 'Dados válidos (express-validator)' });
});
// Rota com Yup
app.post('/yup', async (req, res) => {
try {
await schemaYup.validate(req.body);
res.json({ mensagem: 'Dados válidos (Yup)' });
} catch (err) {
res.status(400).json({ error: err.message });
}
});
// Inicia o servidor
const port = process.env.PORT || 3000; // Configuração para HostGator Plano M
app.listen(port, () => console.log(Servidor rodando na porta ${port}));
npm install express joi express-validator yup
node index.js
Exercício Hands-On (5 min)
Crie uma nova rota /produto que receba via POST os dados de um produto: nome (string, obrigatório), preco (número, obrigatório e maior que zero), e descricao (string, opcional). Utilize a biblioteca express-validator para validar os dados. Retorne um status 400 com os erros de validação caso existam, ou um status 200 com a mensagem “Produto válido” caso os dados sejam válidos.
Solução:
// ... (código anterior)
app.post('/produto', [
check('nome').notEmpty().withMessage('Nome do produto é obrigatório'),
check('preco').isFloat({ gt: 0 }).withMessage('Preço deve ser maior que zero'),
], (req, res) => {
// ... (mesma lógica de validação do exemplo anterior)
res.json({ mensagem: 'Produto válido' });
});
// ... (restante do código)
Teste a rota com diferentes valores para nome, preco e descricao, incluindo valores inválidos, para verificar se a validação está funcionando corretamente.
Próximos passos: Explore a documentação das bibliotecas Joi, Yup e express-validator para aprender sobre recursos avançados, como validação condicional, schemas aninhados e sanitização de dados.
🚀 Pronto para a próxima aula?
Continue sua jornada no desenvolvimento de APIs e domine Node.js & Express!