1 / 10
Modulo 8 / Projeto Integrador

Desenvolvimento com Mentoria

Guia pratico, padroes comuns e resolucao de problemas.

school Aulas 36-37 schedule 4 horas

Roteiro

Como aproveitar estas aulas

today Aula 36 (hoje)

15min Revisao de padroes e dicas rapidas
1h30 Desenvolvimento do projeto em equipe
15min Checkpoint: status de cada equipe

event Aula 37

15min Resolucao de duvidas frequentes
1h30 Desenvolvimento continuado
15min Checkpoint: progresso e proximos passos
lightbulb O professor estara disponivel para tirar duvidas e orientar cada equipe individualmente.

Back-end

Erros comuns

Esquecer o next(err) no controller

// Errado: erro silencioso exports.criar = async (req, res) => { const item = await Model.create(req.body); // Se der erro, o front trava! }; // Correto: sempre ter try/catch + next exports.criar = async (req, res, next) => { try { const item = await Model.create(req.body); res.status(201).json(item); } catch (err) { next(err); } };

Nao usar runValidators no update

// Errado: ignora validacoes do schema Model.findByIdAndUpdate(id, dados); // Correto Model.findByIdAndUpdate( id, dados, { new: true, runValidators: true } );

Expor a senha na resposta

// Errado res.json(usuario); // Correto: nunca retornar a senha res.json({ id: usuario._id, nome: usuario.nome, email: usuario.email });

.env no repositorio

// .gitignore (OBRIGATORIO) node_modules .env // Usar .env.example para referencia MONGODB_URI=sua_url_aqui JWT_SECRET=seu_segredo_aqui

Front-end

Erros comuns

Esquecer o Content-Type

// Errado: body vai como texto fetch('/api/items', { method: 'POST', body: JSON.stringify(dados) }); // Correto fetch('/api/items', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(dados) });

Nao verificar res.ok

// Errado: fetch nao lanca erro em 4XX const data = await fetch(url); const json = await data.json(); // Correto const res = await fetch(url); if (!res.ok) { const err = await res.json(); throw new Error(err.erro); } const data = await res.json();

XSS com innerHTML

// Perigoso: usuario pode injetar script el.innerHTML = dados.nome; // Seguro: escapar o HTML function escapeHTML(str) { const div = document.createElement('div'); div.textContent = str; return div.innerHTML; }

Token hardcoded

// Errado headers: { 'Authorization': 'Bearer abc123...' } // Correto const token = localStorage.getItem('token'); headers: { 'Authorization': `Bearer ${token}` }

Padroes

Padroes uteis

cached Loading state

// Mostrar loading antes do fetch btn.disabled = true; btn.textContent = 'Salvando...'; try { await fetch('/api/items', { ... }); mostrarMensagem('Salvo!', 'sucesso'); } catch (err) { mostrarMensagem(err.message, 'erro'); } finally { btn.disabled = false; btn.textContent = 'Salvar'; }

sync Funcao reutilizavel de fetch

async function api(url, opts = {}) { const token = localStorage.getItem('token'); const res = await fetch(url, { ...opts, headers: { 'Content-Type': 'application/json', ...(token && { 'Authorization': `Bearer ${token}` }), ...opts.headers } }); if (!res.ok) { const err = await res.json(); throw new Error(err.erro); } if (res.status === 204) return; return res.json(); }

Dicas

CSS organizado

Variaveis CSS (design system)

/* Defina seu tema em :root */ :root { --primary: #6366f1; --bg: #0f172a; --bg-card: #1e293b; --text: #e2e8f0; --radius: 12px; } /* Use em todo lugar */ .card { background: var(--bg-card); border-radius: var(--radius); color: var(--text); }

Responsivo com media queries

/* Mobile first: comeca pequeno */ .grid { display: grid; grid-template-columns: 1fr; gap: 16px; } /* Desktop: adiciona colunas */ @media (min-width: 768px) { .grid { grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); } }

Debug

Como debugar

terminal Back-end (Node.js)

  • console.log(req.body) para ver os dados recebidos
  • console.log(err) no catch para ver o erro completo
  • Verificar se o erro e de validacao, cast ou duplicata
  • Testar rotas isoladas com Thunder Client
  • Verificar se o MongoDB esta conectado

web Front-end (navegador)

  • Console (F12): erros de JS, logs
  • Network: ver requests, status, body
  • Elements: inspecionar HTML e CSS
  • Application: ver localStorage (token)
  • Testar fetch direto no console do navegador
lightbulb Dica: na aba Network do DevTools, clique em uma request para ver os headers, body enviado e resposta do servidor.

Progresso

Checkpoint das equipes

fact_check Onde voce deveria estar ao final da aula 37

Minimo esperado
  • check_circle Repositorio no GitHub com commits
  • check_circle Servidor Express rodando
  • check_circle Conexao com MongoDB Atlas
  • check_circle Models criados (pelo menos 1)
  • check_circle Auth (registro + login) funcionando
Ideal
  • star CRUD principal funcionando
  • star Front-end com listagem basica
  • star Formularios com submit via fetch
  • star Tela de login no front
  • star CSS responsivo aplicado

FAQ

Duvidas frequentes

"Posso usar framework CSS (Bootstrap, Tailwind)?"

Sim, desde que saiba justificar. O front do projeto benchmark usa CSS puro como referencia.

"Posso usar React/Next.js no front?"

Nao. O front deve ser HTML + CSS + JavaScript vanilla, conforme aprendido nas aulas.

"Posso ter mais de um CRUD?"

Sim! O minimo e um CRUD completo, mas ter mais modelos enriquece o projeto.

"Precisa ter deploy para a aula 37?"

Nao ainda. O deploy sera feito nas aulas 38-39. Foque no desenvolvimento local.

"Todo mundo precisa fazer commit?"

Sim. Cada membro precisa ter commits no repositorio. Sera verificado no historico.

"Posso usar o projeto-api-produtos como base?"

Como referencia, sim. Mas o projeto deve ter tema e funcionalidades diferentes.

Proxima aula

Aulas 38-39

Desenvolvimento + revisao de codigo (code review).

task_alt O que vimos nestas aulas

  • check_circleErros comuns no back-end e front-end
  • check_circlePadroes uteis (loading, funcao api reutilizavel)
  • check_circleCSS organizado com variaveis e responsivo
  • check_circleDebugging no Node.js e no navegador
  • check_circleCheckpoint de progresso da equipe
Proxima aula
auto_stories Referencia: MDN DevTools
Leandro Medeiros