Las entrevistas de Node.js giran alrededor del event loop, patrones asíncronos, Express o NestJS, y las consecuencias de un runtime de un solo hilo. Aquí están las preguntas más comunes con respuestas modelo. Junior: teoría básica, definiciones y casos prácticos simples.
1
¿Qué es el event loop, y qué significa realmente single-threaded aquí?
Respuesta
Node corre tu JavaScript en un solo hilo y le pasa el I/O al sistema operativo, recogiendo los resultados como callbacks cuando están listos. Single-threaded significa que tu código nunca corre en dos lugares a la vez — pero la espera pasa en otro lugar, por eso Node maneja miles de conexiones inactivas barato. La consecuencia a recordar: un loop lento en tu código bloquea cada request, no solo el que le pertenece.
2
¿Cuál es la diferencia entre un callback, una promise y async/await?
Respuesta
Son el mismo mecanismo en tres niveles de ergonomía. Un callback es una función llamada al completarse y anida mal. Una promise es un objeto que representa un valor futuro que se puede encadenar. async/await es sintaxis sobre promises que te deja escribir código que parece secuencial. Lo que no cambia es el modelo subyacente — await no bloquea el hilo, cede.
3
¿Qué pasa si olvidas hacer await a una promise?
Respuesta
La función continúa inmediatamente con una promise pending en vez del valor, así que obtienes comportamiento indefinido más adelante, y cualquier error adentro se convierte en un unhandled rejection que puede tumbar el proceso. La forma más común es una escritura de base de datos que parece exitosa porque nadie esperó para descubrir que falló. Los linters atrapan esto y la regla vale la pena activarla.
4
¿Cómo manejas un error dentro de una función async?
Respuesta
Con try/catch alrededor del await, porque una promise rechazada dentro de una función async se comporta como un error lanzado. Lo que no funciona es try/catch alrededor de una llamada basada en callback — el callback corre después, fuera del bloque. En Express, los errores de handlers async deben pasarse a next() o el request se cuelga hasta que hace timeout.
5
¿Cuál es la diferencia entre dependencies y devDependencies?
Respuesta
Las dependencies se necesitan para correr la aplicación, las devDependencies solo para construirla y testearla. La distinción importa cuando la imagen de producción instala con --omit=dev: poner una herramienta de build en el lugar equivocado infla la imagen o rompe el build. La pregunta relacionada es package-lock — commitéalo, porque es lo que hace que dos instalaciones produzcan el mismo árbol.
6
¿Qué es el middleware en Express?
Respuesta
Una función que recibe el request, la response y next, y ya sea maneja el request o lo pasa adelante. El orden lo es todo: la autenticación puesta después de la ruta que protege no hace nada, y un error handler debe registrarse último para atrapar lo que viene antes. Olvidar llamar a next() es el bug clásico, y el síntoma es un request que nunca responde.
7
¿Cuál es la diferencia entre process.env y un archivo de config?
Respuesta
Las variables de entorno vienen de fuera del código, así que el mismo build puede correr en staging y producción con valores distintos, y los secretos nunca entran al repo. Un archivo de config es conveniente y versionado, que es exactamente por qué las credenciales no deben vivir en uno. La configuración práctica es un schema que valida las variables al arranque, así que una faltante falla inmediatamente en vez de en el primer request.