Rotas, middleware e arquitetura MVC.
# Criar projeto
$ mkdir minha-api
$ cd minha-api
$ npm init -y
# Instalar Express
$ npm install express
# Instalar devDependencies
$ npm install nodemon --save-dev
const express = require('express');
const app = express();
const PORT = 3000;
// Rota GET na raiz
app.get('/', (req, res) => {
res.send('Olá, Express!');
});
// Iniciar servidor
app.listen(PORT, () => {
console.log(
`Servidor em http://localhost:${PORT}`
);
});
// Sem Express (muitas linhas)
const http = require('http');
const server = http.createServer(
(req, res) => {
if (req.url === '/') {
res.writeHead(200);
res.end('Olá!');
} else {
res.writeHead(404);
res.end('Not found');
}
}
);
server.listen(3000);
// GET — buscar dados
app.get('/usuarios', (req, res) => {
res.json([{ nome: "Ana" }]);
});
// POST — criar dados
app.post('/usuarios', (req, res) => {
res.status(201).json(req.body);
});
// PUT — atualizar dados
app.put('/usuarios/:id', (req, res) => {
res.json({ atualizado: req.params.id });
});
// DELETE — remover dados
app.delete('/usuarios/:id', (req, res) => {
res.json({ removido: req.params.id });
});
// Route params (:id)
app.get('/usuarios/:id', (req, res) => {
const id = req.params.id;
res.send(`Usuário ${id}`);
});
// Query params (?nome=Ana)
app.get('/buscar', (req, res) => {
const nome = req.query.nome;
res.send(`Buscando: ${nome}`);
});
next() para continuar// Middleware de log
function logger(req, res, next) {
console.log(
`${req.method} ${req.url}`
);
next(); // continua para o próximo
}
// Aplicar em todas as rotas
app.use(logger);
// Middleware built-in
app.use(express.json());
app.use(express.static('public'));
Interpreta o body da requisição como JSON. Essencial para receber dados via POST/PUT.
app.use(express.json());
// Agora req.body funciona!
app.post('/api', (req, res) => {
console.log(req.body);
});
Serve arquivos estáticos (HTML, CSS, JS, imagens) de uma pasta.
app.use(
express.static('public')
);
// public/style.css → /style.css
// public/logo.png → /logo.png
Permite requisições de outros domínios (necessário para APIs).
$ npm install cors
const cors = require('cors');
app.use(cors());
const express = require('express');
const app = express();
app.use(express.json());
let tarefas = [
{ id: 1, titulo: "Estudar Express", feita: false },
{ id: 2, titulo: "Criar API", feita: false }
];
app.get('/tarefas', (req, res) => res.json(tarefas));
app.post('/tarefas', (req, res) => {
const nova = { id: tarefas.length + 1, ...req.body, feita: false };
tarefas.push(nova);
res.status(201).json(nova);
});
app.put('/tarefas/:id', (req, res) => {
const tarefa = tarefas.find(t => t.id == req.params.id);
if (!tarefa) return res.status(404).json({ erro: "Nao encontrada" });
Object.assign(tarefa, req.body);
res.json(tarefa);
});
app.delete('/tarefas/:id', (req, res) => {
tarefas = tarefas.filter(t => t.id != req.params.id);
res.json({ mensagem: "Removida" });
});
app.listen(3000);
Extensão do VS Code. Interface visual para testar APIs sem sair do editor.
Apps dedicados para testar APIs. Interface completa com collections e ambientes.
# GET
$ curl http://localhost:3000/tarefas
# POST
$ curl -X POST \
-H "Content-Type: application/json" \
-d '{"titulo":"Nova"}' \
http://localhost:3000/tarefas
Responsável pelos dados e regras de negócio. Representa as entidades da aplicação.
Responsável pela apresentação. Em APIs, é o JSON retornado. Em apps web, são as páginas HTML.
Recebe a requisição, processa usando o Model e retorna a View. Orquestra a lógica.
const express = require('express');
const router = express.Router();
const ctrl = require(
'../controllers/tarefaController'
);
router.get('/', ctrl.listar);
router.post('/', ctrl.criar);
router.put('/:id', ctrl.atualizar);
router.delete('/:id', ctrl.remover);
module.exports = router;
// No index.js:
app.use('/tarefas', require(
'./routes/tarefaRoutes'
));
express.json() para parsear o bodyAPIs RESTful e integração com banco de dados.