Skip to content
Bases de Dados e SQLModo de leitura focado
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

  1. Numa pasta nova api-produtos dentro de fase6, corre npm install express better-sqlite3 cors.
  2. Cria servidor.js: inicializa o Express, ativa cors() e express.json(), e cria (se não existir) uma tabela produtos com id, nome, preco.
  3. Cria a rota GET /produtos que devolve todos os produtos em JSON.
  4. 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.
  5. Se a validação falhar, devolve status 400 com uma mensagem de erro clara.
  6. 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

  1. 1Pedido POST /produtos
  2. 2Express valida req.body
  3. 3INSERT parametrizado
  4. 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'));
Estrutura de partida

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.

As minhas dúvidas

Voltar à vista da fase