Entrevistas de Node.js giram em torno do event loop, padrões assíncronos, Express ou NestJS, e as consequências de um runtime de thread única. Abaixo estão as perguntas mais comuns com respostas modelo. Junior: teoria básica, definições e casos práticos simples.
1
O que é o event loop, e o que single-threaded realmente significa aqui?
Resposta
O Node roda seu JavaScript numa única thread e repassa o I/O para o sistema operacional, recolhendo os resultados como callbacks quando ficam prontos. Single-threaded significa que seu código nunca roda em dois lugares ao mesmo tempo — mas a espera acontece em outro lugar, por isso o Node lida com milhares de conexões ociosas de forma barata. A consequência a lembrar: um loop lento no seu código bloqueia todo request, não só o que pertence a ele.
2
Qual é a diferença entre um callback, uma promise e async/await?
Resposta
São o mesmo mecanismo em três níveis de ergonomia. Um callback é uma função chamada ao completar e aninha mal. Uma promise é um objeto que representa um valor futuro que pode ser encadeado. async/await é sintaxe sobre promises que deixa você escrever código que parece sequencial. O que não muda é o modelo subjacente — await não bloqueia a thread, ele cede o controle.
3
O que acontece se você esquecer de dar await numa promise?
Resposta
A função continua imediatamente com uma promise pending em vez do valor, então você obtém comportamento indefinido mais adiante, e qualquer erro dentro dela vira uma unhandled rejection que pode derrubar o processo. A forma mais comum é uma escrita no banco de dados que parece bem-sucedida porque ninguém esperou para descobrir que falhou. Os linters pegam isso e vale a pena ativar essa regra.
4
Como você trata um erro dentro de uma função async?
Resposta
Com try/catch em volta do await, porque uma promise rejeitada dentro de uma função async se comporta como um erro lançado. O que não funciona é try/catch em volta de uma chamada baseada em callback — o callback roda depois, fora do bloco. No Express, erros de handlers async precisam ser passados para next() ou o request fica pendurado até dar timeout.
5
Qual é a diferença entre dependencies e devDependencies?
Resposta
As dependencies são necessárias para rodar a aplicação, as devDependencies só para construí-la e testá-la. A distinção importa quando a imagem de produção instala com --omit=dev: colocar uma ferramenta de build no lugar errado infla a imagem ou quebra o build. A pergunta relacionada é o package-lock — commite ele, porque é isso que faz duas instalações produzirem a mesma árvore.
6
O que é middleware no Express?
Resposta
Uma função que recebe o request, a response e o next, e ou trata o request ou o repassa adiante. A ordem é tudo: autenticação colocada depois da rota que ela protege não faz nada, e um error handler precisa ser registrado por último para capturar o que vem antes. Esquecer de chamar next() é o bug clássico, e o sintoma é um request que nunca responde.
7
Qual é a diferença entre process.env e um arquivo de config?
Resposta
Variáveis de ambiente vêm de fora do código, então o mesmo build consegue rodar em staging e produção com valores diferentes, e segredos nunca entram no repositório. Um arquivo de config é conveniente e versionado, o que é exatamente por que credenciais não deveriam viver num. A configuração prática é um schema que valida as variáveis na inicialização, então uma faltando falha imediatamente em vez de no primeiro request.