Introducción a Node.js para principiantes

Código no bloqueante

Antes de comenzar os recomiendo instalar una extensión llamada Code Runner en Visual Studio Code, con ella podéis ejecutar los scripts de Node con una simple combinación de teclas Control+Alt+N. Si decidís utilizarla activad la opción RunInTerminal para utilizar la terminal del sistema en lugar de la que viene en Visual Studio Code, eso os ahorrará problemas.

Dicho esto, en el curso para principiantes ya vimos que es posible pasar como argumento un fichero o script con código JavaScript a Node para ejecutar las instrucciones que contiene, hágámoslo de nuevo:

curso-node/hola.js

console.log('Hola mundo');

Para ejecutarlo podemos hacer desde la propia terminal de VSC o con Control+Alt+N si habéis instalado Code Runner:

node hola.js

Como cabría esperar se muestra nuestro saludo por pantalla.

Ahora bien, ¿y si quisiéramos que se muestre el saludo 2 segundos después de ejecutar el programa?

JavaScript cuenta con una instrucción llamada setTimeout que permite establecer una especie de temporizador. Recibe dos argumentos, el primero es una función callback con el código a ejecutar y el otro son los milisegundos que debe esperar antes de ejecutar el código:

setTimeout(function(){
	console.log('Hola mundo');
}, 2000);

Si lo ejecutamos veremos que efectivamente se espera 2 segundos y entonces muestra el mensaje.

En otros lenguajes esto sería equivalente a poner a "dormir" el script durante unos segundos, por ejemplo en Python se hace así:

import time

time.sleep(2)  # dormir 2 segundos
print('Hola mundo')

Ahora bien, mirad lo que ocurre si escribimos otra instrucción después del timeout:

setTimeout(function(){
	console.log('Hola');
}, 2000);

console.log('mundo')

Lo que ocurre es que el código fuera del timeout se llama inmediatamente, no se bloquea la ejecución.

En cambio la misma lógica en Python sí es bloqueante, es como si se parase completamente el programa durante esos 2 segundos:

import time

time.sleep(2)  # dormir 2 segundos
print('Hola')

print('mundo')

El bloqueo de código ocurre en la mayoría de lenguajes pero a veces se puede solventar usando hilos de ejecución paralelos, algo que normalmente requiere de conocimientos avanzados.

Pero eso no es así en Node, ya que al estar desarrollado sobre un motor pensado para el navegador, donde es sumamente importante garantizar el funcionamiento estable y continuo sin bloquear el programa, esta capacidad de ejecutar múltiples tareas a la vez viene de fábrica, y eso que Node se ejecuta en un solo hilo, ¿curioso verdad?

Sea como sea es gracias a esta capacidad de gestionar múltiples tareas que Node es tan bueno manejando servicios con la arquitectura cliente-servidor y de hecho su propio nombre "Node" indica su principal objetivo, servir de "nodo" para unir diferentes procesos en uno.

En la próxima sección veremos como funcionan los módulos, la forma de organizar el código que utiliza Node.