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. Middle: compreensão mais profunda, otimização e situações reais de trabalho.
1
Por que uma operação pesada em CPU é perigosa no Node, e o que você faz a respeito?
Resposta
Porque ela ocupa a única thread que atende todo request — um cálculo de dois segundos faz cada usuário concorrente esperar dois segundos. As opções são mover para um worker thread, para um processo ou fila separados, ou trocar o algoritmo. A armadilha é que isso parece bem com pouco tráfego no desenvolvimento e aparece como um precipício de latência sob carga.
2
Para que servem os streams, e quando dói não usá-los?
Resposta
Eles deixam você processar dados em chunks em vez de ter tudo na memória de uma vez. Ler um upload de um gigabyte com readFile aloca um gigabyte por request concorrente, que é como um serviço morre com três uploads simultâneos. Fazer pipe mantém a memória constante não importa o tamanho do arquivo. O backpressure é a parte que as pessoas pulam — se o destino é mais lento que a fonte, um stream sem pipe acumula buffer até o processo ficar sem memória.
3
Você tem um vazamento de memória em produção. Como você encontra?
Resposta
Confirme primeiro — um heap que sobe e nunca volta depois do garbage collection, em vez do dente de serra normal. Depois tire dois snapshots do heap com minutos de diferença sob carga e compare os objetos retidos; o diff geralmente aponta o culpado diretamente. As causas mais comuns são um cache que cresce sem eviction, listeners adicionados por request e nunca removidos, e closures mantendo um objeto grande vivo.
4
O que o clustering te dá, e o que não dá?
Resposta
Ele roda um processo por núcleo, então você usa a máquina inteira em vez de uma única thread, com o SO balanceando as conexões. O que ele não te dá é estado compartilhado — qualquer coisa em memória agora existe por worker, então caches em processo divergem e sessões quebram a menos que sejam movidas para o Redis. Também não conserta um handler lento; ele multiplica a quantidade de coisas que podem ficar lentas.
5
Como você evita um N+1 com um ORM no Node?
Resposta
Do mesmo jeito que em qualquer lugar: você percebe uma consulta por item no log, depois carrega as linhas relacionadas numa única consulta. Prisma tem include, Sequelize tem eager loading, e um join cru sempre funciona. A armadilha específica do Node é fazer await dentro de um for loop, que serializa chamadas que poderiam rodar juntas — Promise.all resolve a latência, mas não resolve a quantidade de consultas.
6
O que você verifica quando um serviço Node fica lento sob carga?
Resposta
Se o event loop está bloqueado, o que uma métrica de lag responde diretamente sem precisar chutar. Se o loop está bem, o tempo está numa chamada downstream — banco de dados, API upstream — e o esgotamento do connection pool é uma causa frequente. Os logs de latência média escondem isso; os percentis não, porque é no p99 que o esgotamento do pool aparece.
7
Como você testa código que chama uma API externa?
Resposta
Você intercepta na camada HTTP com algo como nock em vez de mockar seu próprio cliente, assim o teste exercita a construção e o parsing reais do request. Grave uma resposta real como fixture e compare com ela. Mockar seu próprio wrapper testa se seu mock coincide com seu mock, por isso essas suítes continuam verdes enquanto a integração quebra.