NodeJS: el servidor JavaScript

El servidor Node.js vió la luz de manos de Ryan Dahl en 2009, la motivación, según la entrevista que BostInno le realizó en enero de 2011, es la arquitectura de E/S orientada a eventos.

Según Dahl: estuve involucrado, de vez en cuando, escribiendo códigos pequeños orientados a eventos. Me gustó el diseño de los servidores orientados a eventos porque sentía que eran más fáciles de comprender: el estado es mantenido en alguna estructura y puedes girar y girar modificando el estado. No había un bucle infinito haciendo bloqueos de lectura o aceptaciones desde los sockets. Me veía capaz de hacer servidores de muy baja latencia usando solo E/S sin bloqueos.

La estructura

Node.js es un intérprete JavaScript mono-hilo, lo cual indica que, la ejecución de un programa, es individual, no se puede diseccionar y, por lo tanto, no comparte información con otros hilos (ya que no los hay), ni con otros procesos, a menos que sea por paso de mensajes de comunicación entre ellos.

El sistema se basa, por sus librerías creadas a tal efecto, en la programación orientada a eventos. Si se quiere crear un servidor que escuche de un determinado puerto, por ejemplo, un servidor web, podemos emplear el siguiente código:

var http = require('http');
http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello World\n');
}).listen(1337, "127.0.0.1");
console.log('Server running at http://127.0.0.1:1337/');

Si lo lanzamos con el comando: node http.js; veremos que se ejecuta y al lanzar un navegador a la URL que indica el sistema, en el navegador podemos ver el texto Hello World. Podemos ver igualmente que si agregamos una espera al proceso, tal que así:

var http = require('http');
http.createServer(function (req, res) {
  var now = new Date().getTime();
  while (new Date().getTime() < now + 5000) {
    // nothing
  }
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello World\n');
}).listen(1337, "127.0.0.1");
console.log('Server running at http://127.0.0.1:1337/');

El sistema espera 5 segundos antes de dar el mensaje, por lo que si abrimos varias lengüetas, pestañas o ventanas del navegador, nos daremos cuenta de que las peticiones se realizan de forma secuencial, esperando 5 segundos cada petición, cuando la anterior termina.

Librerías específicas

Dahl seleccionó ECMAScript (ya que V8 se basa en este y no en JavaScript… aunque realmente ECMAScript sea una estandarización de JavaScript), porque está poco desarrollado en base a librerías. ECMAScript se ha empleado siempre de forma embebida y sobretodo en navegadores, por lo que las librerías de funciones y objetos siempre han sido portadas por los navegadores y fuera de ese contexto, no tienen gran utilidad.

La librería del sistema http es una de las muchas que podemos encontrar en Node.js, hay otras como File, JSON, LDAP, sql, MD5, … todas ellas con la capacidad de instalarse de forma muy simple:

npm install JSON

El listado y búsqueda de paquetes se puede realizar a través de la página oficial de npm. Las librerías que ya vienen instaladas se pueden ver aquí, junto con su documentación.

Conclusiones

Node.js es en sí un intérprete con librerías y una metodología detrás que da que pensar. Como en artículos anteriores, he hablado muchas veces de que JavaScript se ha considerado muchas veces un lenguaje de futuro. Quizás con Node.js, alcanzando un nivel de formalización adecuado, quizás podamos ver ese futuro más férreo y no tan difuso.

Cabe destacar que, entre las extensiones diponibles, se encuentra coffescript, por lo que, también es posible que encontremos diversidad a medida que vaya creciendo el proyecto. De momento, y después de vista la entrevista de hace un año y los progresos que sigue teniendo, se augura un buen futuro a para esta herramienta.