MédioFase 6
Exercício Médio — API de Produtos com Express
Constrói um pequeno servidor Express com rotas GET e POST ligadas a uma tabela SQLite.
FerramentasVS CodeTerminalNode.jsExpressbetter-sqlite3
Objetivo: dar o salto de scripts isolados para uma API real que aceita pedidos HTTP e persiste dados.
Passos a realizar
- Numa pasta nova api-produtos dentro de fase6, corre
npm install express better-sqlite3 cors. - Cria servidor.js: inicializa o Express, ativa cors() e express.json(), e cria (se não existir) uma tabela produtos com id, nome, preco.
- Cria a rota GET /produtos que devolve todos os produtos em JSON.
- Cria a rota POST /produtos que lê nome e preco do corpo do pedido (req.body), valida que ambos existem e que preco é maior que 0, e insere um novo produto — devolvendo o produto criado com status 201.
- Se a validação falhar, devolve status 400 com uma mensagem de erro clara.
- Corre o servidor e testa as duas rotas com o navegador (para o GET) e com uma ferramenta como o Postman, o Insomnia ou o
curl(para o POST).
Fluxo de funcionamento
- 1Pedido POST /produtos
- 2Express valida req.body
- 3INSERT parametrizado
- 4Resposta 201 com o produto
Código de exemplo
servidor.js
const express = require('express');
const cors = require('cors');
const Database = require('better-sqlite3');
const app = express();
app.use(cors());
app.use(express.json());
const db = new Database('produtos.db');
db.exec(`
CREATE TABLE IF NOT EXISTS produtos (
id INTEGER PRIMARY KEY AUTOINCREMENT,
nome TEXT NOT NULL,
preco REAL NOT NULL
)
`);
app.get('/produtos', (req, res) => {
const produtos = db.prepare('SELECT * FROM produtos').all();
res.json(produtos);
});
app.post('/produtos', (req, res) => {
// completa aqui: validar req.body e inserir com consulta parametrizada
});
app.listen(3000, () => console.log('A correr em http://localhost:3000'));Dicas
- Nunca confies em dados vindos de req.body sem os validar primeiro — é a mesma disciplina do IMC da Fase 2, agora aplicada a dados de fora do teu controlo.
- Usa sempre consultas parametrizadas (com ?) ao inserir dados vindos de req.body — nunca concatenes esses valores diretamente na string SQL.
Erros comuns
- Esquecer app.use(express.json()), o que faz req.body chegar como undefined.
- Devolver status 200 em vez de 201 quando algo é criado com sucesso — um pormenor pequeno, mas que segue a convenção HTTP correta.