Recap do material — Event Loop, Promises, async/await, fetch, headers e cookies.
Consumo de APIs com fetch, tratamento de erros, AbortController e estados de UI.
Pausa para refeição antes da prática.
Adicionar interatividade dinâmica às páginas SSR consumindo a própria API do projeto.
Ao final, o aluno conecta a UI do projeto ao back-end via fetch(): lê a página renderizada com EJS e adiciona interações dinâmicas que chamam endpoints JSON, com tratamento de erro, cancelamento e estados de UI.
Microtasks têm prioridade. Um while(true) dentro de um .then trava o event loop e congela a UI.
Promises = microtask. setTimeout = macrotask. Por isso Promise.resolve().then(...) roda antes de setTimeout(..., 0).
.then(value => ...)..catch(err => ...).Encadeamento clássico. Cada .then retorna uma nova Promise. .finally roda em qualquer cenário (útil para fechar loaders).
await só funciona dentro de função async. Top-level await existe em ES modules, mas dentro de funções comuns dispara SyntaxError.
Em async/await, erros viram exceções normais. Use try/catch exatamente como em código síncrono.
É um stream do corpo. Use .json(), .text(), .blob() conforme o tipo.
Crie um helper getJSON(url) em public/js/api.js e reuse em todas as páginas.
Como o front-end SSR e o JSON são servidos pelo mesmo Express, não há CORS — caminho relativo basta.
method: 'POST' — sem isso, vira GET silenciosamente.headers: { 'Content-Type': 'application/json' } — sem isso, o Express com express.json() não parseia o corpo.body: JSON.stringify(...) — objeto JS não serializa sozinho. Sem stringify, o corpo vai como [object Object].→ Cai no catch.
→ res.ok = false, mas o await não dispara erro.
Sempre que um novo evento substitui o anterior: campo de busca digitando, abas trocando, paginação rápida, infinite scroll. Evita renderizar resultado antigo em cima do novo.
data.length === 0. Mensagem amigável.views/users/index.ejs via SSR.application/json).O navegador anexa o cookie de sessão automaticamente em fetch de mesma origem. SameSite=Lax é o default seguro: cookie envia em GETs cross-site mas não em POSTs.
Mesma origem (localhost:3000 servindo HTML e JSON)? Não há problema. Se um dia o front virar app.x.com e a API api.x.com, ative o middleware cors no Express.
F12 → Network. Veja URL, método, status, headers, payload e timing. É a primeira parada quando algo não funciona.
Esta aula: Visão Computational — adicionamos JS assíncrono no front, consumindo a API do back.
Permitir que páginas atualizem dados sem reload, consumindo a API com tratamento adequado de erros e cancelamento.
| USAB Usabilidade | ✅ Feedback imediato |
| CONF Confiabilidade | ✅ Erros tratados |
| DES Desempenho | ✅ Abort + paralelismo |
| SEG Segurança | → CORS + sameSite cookies |
| MANT Manutenibilidade | → Cliente API isolado |
res.ok como checagem obrigatória.MR feat(front): fetch e estados de UI: ao menos uma página EJS do projeto carrega lista via fetch('/api/...') com loading, empty e error states tratados.
Quando você fez fetch('/api/users'), por baixo: DNS resolveu o host → TCP fez handshake → TLS criptografou → HTTP enviou request. Aula 11 abre cada caixa-preta dessas.
O projeto está integrado: backend rodando, frontend conectado, testes Jest escritos. Esta ponderada é o fechamento documental — você vai construir o RTM completo provando que cada persona tem suas necessidades atendidas por requisitos funcionais implementados, testados e evidenciados. O documento produzido aqui é a prova de que o sistema faz o que foi prometido.
Preencha uma linha por combinação RF + RN. Não deixe células vazias na trilha principal, se não tem evidência, escreva "pendente" e justifique.
Mínimo: 3 personas distintas e 5 RFs cobertos.
Para cada eixo não funcional, descreva "como" o projeto atende ao RNF definido na Ponderada 1, com a evidência concreta.
Liste tudo que mudou em relação ao que foi modelado nas Ponderadas 1 e 2. Isso não é penalidade, é rastreabilidade real.
Liste cada evidência referenciada no RTM com uma descrição de onde encontrá-la