backend
Node.js
A pergunta que separa quem só usa Express de quem entende Node é: 'o que acontece quando uma operação bloqueia o event loop?'. Espere perguntas sobre callbacks vs. promises vs. async/await, streams e como escalar um processo single-thread.
Simulador de Node.js
Tópicos por senioridade
Desafios práticos
Cenários reais pra resolver em voz alta, como numa entrevista de verdade — não é múltipla escolha.
- Cenário: uma rota Node.js travando o servidor inteiro
Uma rota específica de uma API Node.js está deixando todas as outras rotas lentas ao mesmo tempo, mesmo sem relação entre elas. O que você suspeita e como confirma?
- Cenário: consumo de memória cresce sem parar
Um serviço Node.js vai consumindo cada vez mais memória ao longo de horas até reiniciar por OOM. Como você investiga um memory leak?
Perguntas mais cobradas
ver todas →- Difícil
Cenário: uma rota Node.js travando o servidor inteiro
Provavelmente código síncrono pesado bloqueando o event loop — confirme com profiling de event loop lag.
- Difícil
Implementando rate limiting em uma API
Contador precisa viver num store compartilhado (ex: Redis) entre instâncias, nunca em memória local de cada processo.
- Difícil
O que é um graceful shutdown
Parar de aceitar requisições novas, terminar as em andamento, fechar conexões, e só então encerrar o processo.
- Difícil
Cenário: consumo de memória cresce sem parar
Heap sobe monotônico mesmo pós-GC. Compare dois heap snapshots (o que acumulou por retained size). Suspeitos: listeners não removidos, caches sem limite, timers não limpos, globais que só crescem.
- Difícil
Streams e backpressure
readFile carrega tudo na RAM (OOM sob concorrência). Stream processa em chunks (memória constante). Backpressure pausa a origem quando o destino não vaza; use `pipeline()` pra erro + cleanup.
- Médio
Worker threads x cluster x child_process
worker_threads: CPU-bound no seu código (memória compartilhável). cluster: escalar servidor HTTP por cores (processos, porta compartilhada). child_process: rodar programa externo ou isolar.
- Difícil
Erro não tratado: rejection, exception e o processo que morre
uncaughtException: erro síncrono no topo. unhandledRejection: Promise rejeitada sem catch. Não 'continue' após eles — o estado pode estar inconsistente. Logue, alerte, graceful shutdown, deixe morrer, supervisor reinicia.
- Médio
CommonJS x ES Modules no Node
CJS: require síncrono, runtime, `__dirname`. ESM: import estático (tree-shakeable), bindings ao vivo, `import.meta.url`, top-level await. Migração morde em: extensão obrigatória, `"type": "module"`, interop CJS↔ESM, mocking.
- Fácil
Configuração por ambiente sem vazar segredo
Do ambiente via `process.env` (`.env` só em dev, gitignorado; secret manager em prod). Valide/tipe no boot e falhe rápido. Centralize num `config.ts`. Nunca commite segredo. Um build, env define o comportamento.