O que você vai aprender
Neste tutorial completo, você aprenderá a criar uma API REST profissional do zero usando Node.js e Express. Vamos cobrir desde a configuração inicial até a implementação de rotas, validação de dados e boas práticas de desenvolvimento.
O que é uma API REST?
REST (Representational State Transfer) é um estilo arquitetural para desenvolvimento de serviços web. Uma API REST permite que diferentes aplicações se comuniquem através de requisições HTTP, usando métodos padronizados como GET, POST, PUT e DELETE.
APIs REST são fundamentais no desenvolvimento moderno porque:
- Permitem comunicação entre frontend e backend
- Facilitam a integração entre diferentes sistemas
- São escaláveis e fáceis de manter
- Funcionam em qualquer plataforma e linguagem
Pré-requisitos
Antes de começar, certifique-se de ter instalado em seu computador:
Node.js
Versão 18.x ou superior
NPM ou Yarn
Gerenciador de pacotes
Editor de código
VS Code recomendado
node --version no terminal. Se não tiver, baixe em nodejs.org
Passo a Passo Passo a Passo: Criando sua API
Configuração Inicial do Projeto
Primeiro, vamos criar a estrutura do nosso projeto. Abra o terminal e execute:
# Criar pasta do projeto mkdir minha-api-rest cd minha-api-rest # Inicializar o projeto Node.js npm init -y # Instalar dependências necessárias npm install express cors dotenv # Instalar dependências de desenvolvimento npm install --save-dev nodemon
O que cada pacote faz:
- express: Framework web minimalista para Node.js
- cors: Permite requisições de diferentes origens
- dotenv: Gerencia variáveis de ambiente
- nodemon: Reinicia o servidor automaticamente durante desenvolvimento
Estrutura de Pastas
Organize seu projeto com a seguinte estrutura:
minha-api-rest/ │ ├── src/ │ ├── controllers/ │ │ └── userController.js │ ├── routes/ │ │ └── userRoutes.js │ ├── models/ │ │ └── userModel.js │ └── app.js │ ├── .env ├── .gitignore ├── package.json └── server.js
Criando o Servidor Principal
Crie o arquivo server.js na raiz do projeto:
const express = require('express'); const cors = require('cors'); require('dotenv').config(); const app = express(); const PORT = process.env.PORT || 3000; // Middlewares app.use(cors()); app.use(express.json()); // Rota de teste app.get('/', (req, res) => { res.json({ message: 'API está funcionando!', version: '1.0.0' }); }); // Iniciar servidor app.listen(PORT, () => { console.log(`Servidor rodando na porta ${PORT}`); });
Implementando as Rotas
Crie o arquivo src/routes/userRoutes.js:
const express = require('express'); const router = express.Router(); // Simulando um banco de dados em memória let users = [ { id: 1, name: 'João Silva', email: 'joao@email.com' }, { id: 2, name: 'Maria Santos', email: 'maria@email.com' } ]; // GET - Listar todos os usuários router.get('/users', (req, res) => { res.json(users); }); // GET - Buscar usuário por ID router.get('/users/:id', (req, res) => { const user = users.find(u => u.id === parseInt(req.params.id)); if (!user) { return res.status(404).json({ error: 'Usuário não encontrado' }); } res.json(user); }); // POST - Criar novo usuário router.post('/users', (req, res) => { const { name, email } = req.body; if (!name || !email) { return res.status(400).json({ error: 'Nome e email são obrigatórios' }); } const newUser = { id: users.length + 1, name, email }; users.push(newUser); res.status(201).json(newUser); }); // PUT - Atualizar usuário router.put('/users/:id', (req, res) => { const user = users.find(u => u.id === parseInt(req.params.id)); if (!user) { return res.status(404).json({ error: 'Usuário não encontrado' }); } const { name, email } = req.body; user.name = name || user.name; user.email = email || user.email; res.json(user); }); // DELETE - Remover usuário router.delete('/users/:id', (req, res) => { const index = users.findIndex(u => u.id === parseInt(req.params.id)); if (index === -1) { return res.status(404).json({ error: 'Usuário não encontrado' }); } users.splice(index, 1); res.status(204).send(); }); module.exports = router;
Conectando as Rotas ao Servidor
Atualize o server.js para incluir as rotas:
const express = require('express'); const cors = require('cors'); const userRoutes = require('./src/routes/userRoutes'); require('dotenv').config(); const app = express(); const PORT = process.env.PORT || 3000; app.use(cors()); app.use(express.json()); // Usar as rotas app.use('/api', userRoutes); app.get('/', (req, res) => { res.json({ message: 'API REST com Node.js', endpoints: { users: '/api/users' } }); }); app.listen(PORT, () => { console.log(`🚀 Servidor rodando em http://localhost:${PORT}`); });
Configurando Scripts no package.json
Adicione os seguintes scripts no seu package.json:
"scripts": { "start": "node server.js", "dev": "nodemon server.js" }
Testando a API
Inicie o servidor com:
npm run dev
Agora você pode testar os endpoints usando ferramentas como Postman, Insomnia ou até mesmo o navegador:
- GET http://localhost:3000/api/users - Lista usuários
- GET http://localhost:3000/api/users/1 - Busca usuário específico
- POST http://localhost:3000/api/users - Cria novo usuário
- PUT http://localhost:3000/api/users/1 - Atualiza usuário
- DELETE http://localhost:3000/api/users/1 - Remove usuário
Boas Práticas e Segurança
Faça Sempre
- Valide todos os dados de entrada
- Use variáveis de ambiente para dados sensíveis
- Implemente tratamento de erros adequado
- Adicione logs para debugging
- Use HTTPS em produção
- Implemente rate limiting
- Documente seus endpoints
- Use versionamento de API
Evite
- Expor informações sensíveis nos erros
- Commits com credenciais no código
- Aceitar dados sem validação
- Usar porta padrão em produção
- Ignorar atualizações de segurança
- Deixar endpoints sem autenticação
- Retornar stack traces em produção
Próximos Passos
Agora que você tem uma API básica funcionando, considere implementar:
Banco de Dados
Conecte com MongoDB, PostgreSQL ou MySQL
Autenticação
Adicione JWT ou OAuth2
Validação
Use bibliotecas como Joi ou Yup
Documentação
Implemente Swagger/OpenAPI
Testes
Adicione Jest ou Mocha
Deploy
Publique em Heroku, Vercel ou AWS
Integrando com Banco de Dados
Para tornar sua API mais robusta, vamos conectá-la com MongoDB usando Mongoose:
# Instalar Mongoose
npm install mongoose
Crie o arquivo src/config/database.js:
const mongoose = require('mongoose'); const connectDB = async () => { try { await mongoose.connect(process.env.MONGODB_URI, { useNewUrlParser: true, useUnifiedTopology: true }); console.log('✅ MongoDB conectado com sucesso!'); } catch (error) { console.error('❌ Erro ao conectar MongoDB:', error.message); process.exit(1); } }; module.exports = connectDB;
.env:MONGODB_URI=mongodb://localhost:27017/minha-api
Exemplo Completo com Middleware
Vamos adicionar um middleware de logging para rastrear todas as requisições:
const logger = (req, res, next) => { const timestamp = new Date().toISOString(); console.log(`[${timestamp}] ${req.method} ${req.url}`); next(); }; module.exports = logger;
Use o middleware no server.js:
const logger = require('./src/middlewares/logger'); // Adicione antes das rotas app.use(logger);
Tratamento de Erros
Implemente um middleware global para capturar erros:
const errorHandler = (err, req, res, next) => { console.error(err.stack); res.status(err.statusCode || 500).json({ success: false, error: err.message || 'Erro interno do servidor', ...(process.env.NODE_ENV === 'development' && { stack: err.stack }) }); }; module.exports = errorHandler;
Checklist de Produção
Antes de colocar sua API em produção:
- Todas as variáveis sensíveis estão em .env
- CORS configurado corretamente
- Rate limiting implementado
- Validação de dados em todas as rotas
- Logs configurados adequadamente
- Testes automatizados criados
- Documentação da API completa
- HTTPS configurado
- Backup do banco de dados configurado
- Monitoramento e alertas ativos
Recursos Adicionais
Para aprofundar seus conhecimentos, consulte estes recursos oficiais:
- Documentação do Express: expressjs.com
- Node.js Docs: nodejs.org/docs
- REST API Best Practices: restfulapi.net
- MDN Web Docs: developer.mozilla.org
Performance: Use compressão gzip com o pacote compression para reduzir o
tamanho das respostas em até 70%.
Segurança: Instale o helmet para proteger sua aplicação de vulnerabilidades
conhecidas configurando headers HTTP adequados.
Debugging: Use o VS Code Debugger ou o módulo debug do npm para facilitar a
identificação de problemas durante o desenvolvimento.
Conclusão
Parabéns! Você criou sua primeira API REST com Node.js e Express. Este é apenas o começo de sua jornada no desenvolvimento backend. Continue praticando, explorando novos recursos e implementando melhorias.
Lembre-se: uma boa API é aquela que é fácil de usar, bem documentada, segura e mantém a consistência em todos os endpoints. Com o conhecimento adquirido neste tutorial, você está pronto para construir APIs mais complexas e robustas.