Leodario.com

Leodario.com – Tudo sobre Tecnologia

Aula 51 – API JavaScript, Node.js e Express – Data Validation – Joi, Yup, express-validator

Imagem destacada da aula de API

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!

📚 Ver todas as aulas