¿Qué es Node.js?

Node.js es un entorno Javascript que se ejecuta en el servidor, está basado en eventos y utiliza programación asíncrona.
Hasta hace unos años se suponía que Javascript se ejecutaba en el cliente, pero en el año 2009, Ryan Dahl (el padre de Node.js) adaptó el motor V8 que Google  utilizaba en Chrome y que había liberado el año anterior. Este motor compila el código Javascript en lugar de interpretarlo y hace que la ejecución sea bastante más rapida en comparación.

Node.js se ejecuta en un único hilo y utiliza un modelo I/O sin bloqueo controlado por eventos. Esto quiere decir que recibe las peticiones en el hilo principal y las gestiona de una en una sin bloquear el hilo. Empieza a procesar la primera petición hasta que llega, comienza a ejecutar una tarea asíncrona y en ese momento deja la primera tarea en espera (hasta que reciba el evento de fin de la tarea) e inicia el proceso de la segunda.

Node.js no es el lenguaje definitivo, ni es mejor que el lenguaje X, ni es el más bonito, pero si lo utilizas en los casos en los que se le puede sacar más provecho funciona muy bien.
Node.js funciona muy bien como backend dando respuesta a muchas peticiones de forma concurrente, por lo que te puede venir muy bien si quieres crear :

  • Web Apps en tiempo real
  • Api’s, Node maneja bien grandes cantidades de peticiones I/O, como operaciones en bases de datos.
  • Aplicaciones con Streaming.
  • Juegos multijugador en tiempo real

En cambio deberías buscar una alternativa si lo que quieres es ejecutar procesos con un uso intensivo de la CPU como:

  • Procesar imágenes.
  • Procesar sonido.

Instalación

Yo utilizo Kubuntu 16.04, pero cualquier distribución basada en Ubuntu 12.04, 14.04 y 16.04 es compatible. Si tienes otra distribución, consulta este enlace.

Y ya lo tenemos instalado.
Además, junto con Node, hemos instalado el gestor de paquetes npm, que nos facilitará mucho las cosas a la hora de instalar nuevos módulos para nuestras aplicaciones. Más adelante explico algo sobre esto.

Primeros pasos

Ahora ya podemos empezar a hacer el “Hola mundo” típico que hacemos cada vez que empezamos con un lenguaje de programación.

Creamos un archivo que podemos llamar por ejemplo hola.js con el siguiente código:

Guardamos y ya tenemos nuestro primer script de Node listo.
Para ejecutarlo basta con abrir un terminal en la carpeta donde hayamos guardado el archivo y ejecutar:

A partir de aquí podemos crear un script que haga lo que se nos ocurra utilizando Javascript simple.

Pero hemos dicho que Node.js se ejecuta en un servidor, así que vamos a ver el ejemplo típico también de “hola mundo” desde el servidor.

Igual que antes creamos un archivo (holaMundoServer.js por ejemplo) y ponemos el siguiente código:

En la primera linea importamos el módulo que necesitamos para poder crear el servidor. Después creamos el servidor y lo ponemos en escucha en el puerto 3000.
Ahora cada vez que alguien haga una petición, podemos recibir la petición (req) tratar la información como necesitemos y enviar una respuesta (res). En este caso simplemente escucha la petición y devuelve un mensaje en texto plano

Guardamos, y ponemos el servidor en escucha:

Ahora desde el navegador si intentamos acceder a:

Y el navegador nos mostrará el “Hola mundo”.

Esa función es un poco…

Si no estás familiarizado con Javascript es posible que este ejemplo ya te parezca un poco raro. Una función equivalente sería:

La función “createServer” crea un objeto servidor que cada vez que reciba una petición ejecutará  la función “funcionCallbak” que le pasamos. El servidor ejecutará la función y lo hará pasándole dos objetos con información sobre la request y la response que nosotros recogemos y utilizamos.  Los parámetros de las funciones callback son opcionales, pero en este caso por ejemplo si no los utilizamos, la función callback no serviría para nada.

Este tipo de funciones se usan para garantizar que las funciones se ejecutan en un determinado orden, ya que en Javascript hay ciertas funciones que se ejecutan de forma asíncrona. En otro post hablaré sobre la ejecución asíncrona, de momento vale con saber que existe y que hay veces que puede hacer que el programa no se ejcute como esperamos.

Wtf?

Con un ejemplo igual se entiende mejor, imagina que queremos mostrar todos los modelos de mesas de una tienda de mesas:

De este modo la consola nos va a mostrar un array vacio, ya que la consulta se va a ejecutar de forma asíncrona y el hilo principal va a seguir ejecutando el código que haya después.  Es decir,

“hago llamada a base de datos y espero a que conteste” -> “muestro resultado” -> “la consulta devuelve arrayMesas y se lo asigna a resultado”

Queremos que se ejecute de la siguiente forma :

“hago llamada a base de datos y espero a que conteste” -> “la consulta devuelve arrayMesas y se lo asigna a resultado” -> “muestro resultado

El código para este ejemplo quedaría así:

No te preocupes si al principio es un poco lioso, lleva tiempo y muchas metidas de pata asimilar esta forma de ejecución.

Fin

Fácil, sencillo y para toda la familia… o no. A partir de aquí podemos complicarlo hasta donde nosotros queramos/necesitemos.
Si nos metemos en un proyecto más o menos importante, necesitaremos gestionar la seguridad del servidor y/o de la aplicación, acceder a bases de datos, utilizar varias rutas de acceso, recopilar, procesar y organizar la información que queremos devolver, etc…
Pero esto lo dejamos para proximos posts.

Cualquier sugerencia/agradecimiento es bienvenida.
Espero que os sirva.

Sobre El Autor

Economista reconvertido a programador. Hoy en día trabajo como Desarrollador de aplicaciones web y móvil con Node.js, Angular.js (MEAN Stack) e Ionic framework. También intento mantenerme al día de lo que se mueve en este mundillo y mantengo este pequeño blog como documentación personal. Si echas algo de menos en el blog no dudes en comentar, y si te ha resultado de utilidad algún artículo, te agradezco que lo agradezcas ;-). ¡Un saludo!

Artículos Relacionados

Hacer Comentario

Su dirección de correo electrónico no será publicada.