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.
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
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"));
Testando com Thunder Client
Para o POST:
Selecione POST, URL .../produtos, aba Body -> JSON.
Desafio: Gestão de Categorias
categorias.
GET /categorias.
POST /categorias.
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.