Introduccion a Node.js

Publicado en

En los últimos años Javascript ha crecido y empezado a tener un espacio importante en la escena de los lenguajes de programación. Poco a poco el potencial de los navegadores web ha aumentado, y con ello la capacidad de construir aplicaciones interactivas sin necesidad de instalar plugins o instalar software adicional. Esto atrajo a muchos programadores, quienes a su vez empezaron a sacar a Javascript del browser y han creado frameworks de javascript para crear aplicaciones móviles, tales como Phonegap y Titanium Appcelerator.

En el lado del servidor, Javascript también ha evolucionado significativamente. Una de las personas que más ha contribuido en este sentido es Douglas Crockford, quien actualmente es Arquitecto Javascript en la empresa Yahoo!. Una de las tecnologías “server-side” javascript que más fuerza está tomando y que promete mucho, es Node.js. Conocido también como “Node”, éste fue creado por Ryan Dahl y presentado por primera vez en el JSConf2009, y en poco tiempo ha logrado desplazar en popularidad a otras implementaciones de server-side javascript como Rhino, Ringo y Narwhal.

Un aspecto fundamental de Node.js es que es un non-blocking event server (servidor de eventos sin bloqueo). Algunas alternativas similares son Event Machine en Ruby y Twisted en Python. ¿Qué es eso de un servidor de eventos sin bloqueo? Bueno, pues sucede que en la mayoría de los lenguajes de programación, el comportamiento default al realizar una petición a la base de datos, es que el programa se quede esperando la respuesta y no haga nada más; es decir, las peticiones se manejan de forma síncrona. En cambio, en un servidor de eventos las peticiones son asíncronas, por lo que se realiza una petición, y mientras llega la respuesta se pueden realizar otras tareas y una vez que se reciba la respuesta se procesa la información correspondiente. Este tipo de comportamiento es el mismo que se tiene con Ajax en el lado del cliente.

Node.js corre sobre V8, el motor de Javascript de Google Chrome, el cual es conocido por su velocidad. La buena noticia es que Mozilla Software Foundation ya está implementando Node.js sobre su su propio motor de Javascript, SpiderMonkey, con lo cual se generará competencia y seguramente estaremos viendo que el desempeño de estos motores mejore aun más en los próximos meses.

Por ahora, uno de los usos más comunes de Node.js es crear aplicaciones web que funcionan en tiempo real utilizando web sockets o comet (long polling). Otras aplicaciones comunes de node.js es el monitoreo de servidores y scripts para reducir (minify) CSS y Javascript.

Hola mundo

El típico “hola mundo” de Node.js consiste en programar un servidor web. El listado 1 muestra el código para esto:

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/’);

Listado 1. Servidor web en node.js

Lo primero que hace el código es cargar el módulo http y guardarlo en una variable. Después creamos un servidor con la función “createServer”, la cual toma como parámetro una función callback que recibe como parámetros una petición y una respuesta (req, res). En este caso, la respuesta consiste en imprimir una página web en texto plano que diga “Hello World”. Una vez que definimos lo que va a realizar nuestra función, comenzamos a escuchar peticiones en un puerto específico (en este caso elegimos el 1337) e imprimimos un mensaje de aviso.

Para generar un servidor web tipo Comet, lo único que tenemos que hacer es retrasar la respuesta hasta que tengamos la información que deseamos enviar. El listado 2 muestra como hacerlo.

var http = require(‘http’);
var e = require(‘events’).EventEmitter;
http.createServer(function (req, res) {
event.on(‘comet’, function (data) {
res.writeHead(200, {‘Content-Type’: ‘text/plain’});
res.end(data);
});
}).listen(1337, “127.0.0.1”);
console.log(‘Server running at http://127.0.0.1:1337/’);

Listado 2. Servidor tipo comet

Es un código muy similar al anterior, con la diferencia de que cargamos el módulo emisor de eventos de Node.js (EventEmitter) y esperamos a tener un evento de tipo ‘comet’ para responder a la nueva conexión que tenemos. Para disparar el evento, en algun lugar de nuestra aplicación agregaríamos algo como:

event.emit(‘comet’, ‘Esta es tu nueva información’);

Así, podemos usar jQuery y hacer una petición con $.ajax() al url donde tengamos nuestro servidor y responder a eventos como mensajes en un chat o cambio a un archivo. También podemos hacer que una url en nuestra aplicación cada que reciba una petición publique lo que recibe y de esta forma conectarlo con cualquier aplicación que utilice webhooks.

Generar un servidor de Comet con Node.js implica agregar un par de líneas a nuestra aplicación, mientras que lograr esto mismo en un servidor Apache es mucho más complicado y poco eficiente.

Por donde empezar

Las instrucciones para instalar Node.js están disponibles en https://github.com/joyent/node/wiki/Installation su sistema operativo. Una vez que lo tengan instalado les recomiendo ir a http://search.npmjs.org para buscar librerías. También existen PaaS tipo Heroku para Node.js como No.de, Nodester y DotCloud.

 

 

Bio

Daniel Zavala es un desarrollador web freelancer. Actualmente colabora con la Facultad de Filosofia y Letras de la UNAM para generar la Biblioteca Digital del Pensamiento Novohispano. También ayuda con la organizacion del Super Happy Devhouse Mexico City y es cofundador del Hacker Room. @siedrix