AULA 23
MÓDULO 1
atividade prática
⏱ 90 min
Atividade: Seu Primeiro Servidor
Síntese do Módulo 1: construa uma API REST completa com Express. GET, POST, PATCH, DELETE. Validação. Estrutura em camadas desde o início.
ExpressNode.jsCRUDRESTvalidaçãocurl404
O que você vai construir
Chegou a hora de juntar tudo do Módulo 1. Você vai criar do zero uma API REST completa com Express — com todos os métodos HTTP, validação e tratamento de erros.
API: GERENCIADOR DE TAREFAS (TODO API)
PASSO 1
Criar projeto Node: npm init, instalar express
PASSO 2
Implementar GET /tasks — listar tarefas (array em memória)
PASSO 3
Implementar POST /tasks — criar tarefa com validação
PASSO 4
Implementar PATCH /tasks/:id — marcar como concluída
PASSO 5
Implementar DELETE /tasks/:id — remover tarefa
PASSO 6
Testar todos os endpoints com curl ou Postman
PASSO 7
Bônus: adicionar paginação e filtro ?completed=true
Estrutura do projeto
Mesmo sendo simples, organize desde o início em camadas — você já sabe SOLID e arquitetura em camadas.
todo-api/
├── src/
│ ├── controllers/ ← taskController.js
│ ├── services/ ← taskService.js
│ ├── data/ ← taskRepository.js (array)
│ └── routes/ ← taskRoutes.js
├── app.js ← configura Express
├── server.js ← inicia o servidor
└── package.json
├── src/
│ ├── controllers/ ← taskController.js
│ ├── services/ ← taskService.js
│ ├── data/ ← taskRepository.js (array)
│ └── routes/ ← taskRoutes.js
├── app.js ← configura Express
├── server.js ← inicia o servidor
└── package.json
testar com curl
curl -s localhost:3000/tasks | jq # listar | curl -X POST -H 'Content-Type: application/json' -d '{"title":"Estudar Node"}' localhost:3000/tasks
javascript
// app.js — servidor Express completo const express = require('express') const app = express() app.use(express.json()) let tasks = [] let nextId = 1 // GET /tasks — listar app.get('/tasks', (req, res) => { const { completed } = req.query let result = tasks if (completed !== undefined) result = tasks.filter(t => String(t.completed) === completed) res.json(result) }) // POST /tasks — criar app.post('/tasks', (req, res) => { const { title } = req.body if (!title?.trim()) return res.status(400).json({ error: 'title obrigatório' }) const task = { id: nextId++, title, completed: false } tasks.push(task) res.status(201).json(task) }) // PATCH /tasks/:id — atualizar app.patch('/tasks/:id', (req, res) => { const task = tasks.find(t => t.id === Number(req.params.id)) if (!task) return res.status(404).json({ error: 'Not found' }) Object.assign(task, req.body) res.json(task) }) // DELETE /tasks/:id app.delete('/tasks/:id', (req, res) => { const idx = tasks.findIndex(t => t.id === Number(req.params.id)) if (idx === -1) return res.status(404).json({ error: 'Not found' }) tasks.splice(idx, 1) res.status(204).send() }) app.listen(3000, () => console.log('API em :3000'))
quiz · aula 23
Teste seus conhecimentos
0/3 respondidas
QUESTÃO 01
Por que separar routes, controllers e services desde o início?
QUESTÃO 02
Para que serve o middleware express.json()?
QUESTÃO 03
O que diferencia 201 de 200 como resposta de POST?
0/3