🍣 Haruy Sushi API

Aula 04: Express.js, Roteamento e Thunder Client

O Objetivo da Missão

Hoje vamos construir o Backend que alimentará o site de pedidos. Vamos sair de um cardápio estático para um sistema onde podemos gerenciar produtos e categorias em tempo real.

Contexto: O Mobile apenas "pergunta" ao servidor: "Quais são os pratos de hoje?". O servidor responde com um JSON.

1

Preparando o Terreno (Setup)

Abra o terminal no VS Code e execute os comandos abaixo.

mkdir haruy-sushi-api
cd haruy-sushi-api
npm init -y
npm install express
npm install -D nodemon
2

Criando o Servidor e Rota de Produtos

const express = require('express');
const app = express();
app.use(express.json());

let produtos = [
    { id: 1, nome: "Temaki Completo", preco: 35.50, categoria: "Temakis" },
    { id: 2, nome: "Combinado 20 Peças", preco: 85.00, categoria: "Combinados" }
];

// Listar Produtos
app.get('/produtos', (req, res) => {
    res.json(produtos);
});

// Adicionar Produto
app.post('/produtos', (req, res) => {
    const { nome, preco, categoria } = req.body;
    const novoProduto = { id: produtos.length + 1, nome, preco, categoria };
    produtos.push(novoProduto);
    res.status(201).json(novoProduto);
});

app.listen(3000, () => console.log("Servidor rodando"));
3

Testando com Thunder Client

Para o POST:

Selecione POST, URL .../produtos, aba Body -> JSON.

{ "nome": "Hot Roll", "preco": 28.0, "categoria": "Hots" }

Desafio: Gestão de Categorias

Crie um array categorias.
Crie a rota GET /categorias.
Crie a rota POST /categorias.
Nível Pro: Rota GET /produtos/categoria/:nome para filtrar.

Gabarito do Desafio

Esta é a estrutura esperada para gerenciar as categorias do Haruy Sushi:

// 1. Array de Categorias
let categorias = ["Temakis", "Combinados", "Bebidas"];

// 2. Listar todas as categorias
app.get('/categorias', (req, res) => {
    res.json(categorias);
});

// 3. Adicionar nova categoria
app.post('/categorias', (req, res) => {
    const { nome } = req.body;
    if (nome) {
        categorias.push(nome);
        return res.status(201).json({ mensagem: "Categoria criada!", categorias });
    }
    res.status(400).json({ erro: "Nome é obrigatório" });
});

// 4. BÔNUS: Filtrar produtos por categoria
app.get('/produtos/categoria/:nome', (req, res) => {
    const { nome } = req.params;
    const filtrados = produtos.filter(p => 
        p.categoria.toLowerCase() === nome.toLowerCase()
    );
    res.json(filtrados);
});

Por que usar .filter()?

Diferente do .find(), o .filter() retorna TODOS os itens que atendem à condição, o que é perfeito para listar itens de uma aba no App Mobile.

req.params vs req.body

Usamos params quando a informação vem na URL (:nome) e body quando enviamos dados complexos (JSON) via POST.

⚠️ Erros Comuns

Esquecer o Middleware

Sem app.use(express.json()), o seu req.body virá undefined.

ID duplicado

Ao usar produtos.length + 1, se você deletar itens, os IDs podem se repetir. No futuro usaremos UUIDs ou Bancos de Dados.