Definir a fronteira do servidor
O back-end oferece à interface um lugar confiável para solicitar trabalho. Com Node.js e Express, você aprenderá como uma rota recebe uma solicitação, aplica a lógica da aplicação e devolve uma resposta útil. Uma fronteira clara separa a apresentação das regras e do tratamento de dados.
Dar aos dados um lugar duradouro
MongoDB apresenta o armazenamento de dados orientado a documentos. É preciso decidir quais informações pertencem juntas, como os registros se relacionam com a aplicação e como o servidor os consulta ou atualiza. Uma camada de dados bem estruturada torna a aplicação útil além de uma sessão do navegador.
Conectar identidade a ações protegidas
A autenticação faz parte do fluxo da aplicação, não apenas de uma tela de entrada. JWT e Google OAuth cumprem papéis diferentes: um representa uma sessão autenticada e o outro permite estabelecer a identidade por meio do Google. A etapa reúne rotas, dados e identidade numa aplicação dinâmica.
Do conceito ao código funcional
Estes trechos mostram como os conceitos de cada nível aparecem em projetos reais. São pontos de partida para ler, questionar, adaptar e testar — não código para copiar sem entender.
Validar na fronteira do servidor
A rota obtém o ID da oficina pela URL e valida os dados antes de gravar. Ela diferencia entradas inválidas, oficina inexistente e criação bem-sucedida com status HTTP apropriados.
router.post("/workshops/:id/registrations", async (req, res) => {
const { name, email } = req.body;
const workshopId = req.params.id;
if (!name?.trim() || !/^\S+@\S+\.\S+$/.test(email ?? "")) {
return res.status(400).json({ error: "Name and valid email required." });
}
const workshop = await workshops.findOne({ _id: workshopId });
if (!workshop) return res.status(404).json({ error: "Workshop not found." });
const registration = await registrations.insertOne({
workshopId,
name: name.trim(),
email: email.toLowerCase(),
createdAt: new Date(),
});
return res.status(201).json({ id: registration.insertedId });
});Isolar a persistência em um repositório
O repositório concentra as operações do MongoDB e oferece uma interface pequena ao restante da aplicação. Assim a rota fica clara e o armazenamento pode ser alterado ou testado em um único local.
export function createRegistrationRepository(db) {
const registrations = db.collection("registrations");
return {
async create(input) {
const result = await registrations.insertOne({
workshopId: input.workshopId,
name: input.name.trim(),
email: input.email.toLowerCase(),
status: "pending",
createdAt: new Date(),
});
return { id: result.insertedId.toString(), status: "pending" };
},
findForWorkshop(workshopId) {
return registrations.find({ workshopId }).toArray();
},
};
}Leia e depois adapteAltere um requisito, preveja o resultado e execute o código para conferir. Na revisão, explique a escolha feita e uma melhoria que faria a seguir.