Primeros pasos con NodeJS

Es la hora de aprender un poco sobre NodeJS. En este artículo voy a guiarte para que puedas montar un primer programa que se ejecute desde la línea de comando y después un sencillo servidor que responda a peticiones HTTP simples. En realidad, nuestro verdadero objetivo será perder el miedo y dar nuestros primeros pasos con NodeJS.

Aunque instalar NodeJS no tiene mucho misterio, aquí en malnuer ya os hablé sobre eso hace unos días, así que si tienes problemas o prefieres que te guíe paso a paso en el proceso de instalación, no te pierdas este artículo: Cómo instalar NodeJS

Cuando lo tengas instalado, necesitaremos una carpeta para guardar dentro nuestras pruebas y un primer archivo Javascript al que llamaremos “factorial.js” (vamos a empezar con un clásico). Gracias a NodeJS podemos ejecutar código Javascript sin necesidad de usar un navegador desde la línea de comandos, así que vamos a hacer un sencillo programa que nos calcule el factorial de un número:

// Vemos el número de parámetros
var numArg = process.argv.length;
// Verificamos que el número de argumentos es correcto
if(numArg==3){
  // Cogemos el argumento y lo pasamos a número
  var numero = parseInt(process.argv[2]);
  // Verificamos que el valor sea numérico entre 1 y 20
  if(numero>0 && numero<=20){
    // Ponemos un cartel
    console.log("\nFactorial de "+numero+":");
    // Calculamos el factorial
    var salida = '';
    var resultado = 1;
    for(var i=numero;i>1;i--){ salida += i+'x'; resultado *= i; }
    // Mostramos el resultado
    console.log(salida+"1 = "+resultado);
  }else{
    // Error por tipo de argumento
    console.log("\nError tipo argumento, se espera un número entre 1 y 20");
  }
}else{
  // Error por número de argumentos
  console.log("\nError número de argumentos, se esperaba sólo un argumento");
}

La verdad es que creo que es lo suficientemente fácil como para no tener que añadir nada más, y además he puesto un montón de comentarios en azul para que se diferencien mejor y se entienda todo. Vamos a ponerlo en marcha y luego te comento un par de cositas. Desde la línea de comando escribe esto:

> node factorial.js 10

Factorial de 10:
10x9x8x7x6x5x4x3x2x1 = 3628800

Escribir “node” seguido del nombre de un archivo Javascript sirve para ejecutar dicho archivo. Si además queremos pasarle parámetros adicionales, podemos ponerlos detrás. Aquí el 10 es un argumento que recibiremos dentro del programa. Para recogerlo usamos process.argv que es un array que contendrá todos los argumentos que se añaden a la línea de comando, pero cuidado porque el índice cero de este array es la palabra “node“, y el índice uno es el nombre del archivo Javascript “factorial.js“. Por eso en el código nos aseguramos de que haya 3 argumentos para poder calcular el factorial.

Fíjate que hemos usado console.log() para escribir en la pantalla. Esto es porque no estamos ejecutando el programa en un navegador, y por lo tanto hay muchas cosas que no están disponibles, como por ejemplo la función alert(), el objeto window que está relacionado con el navegador, o el objeto document que nos daría acceso al DOM. Olvídate de todo eso.

NodeJS Factorial

Ejemplo de NodeJS Factorial.js

Aunque ya has visto que hay algunas limitaciones, seguimos teniendo todo el poder de Javascript a nuestra disposición.

Pero donde realmente NodeJS puede resultar útil es a la hora de crear un servidor, recibir peticiones vía Internet y devolver información (Web, API…), así que vamos a hacer uno. Necesitaremos usar un módulo llamado “http” que viene por defecto con NodeJS y contiene muchas funciones para poder manejar los distintos aspectos que necesitamos controlar para montar un servidor.

Así que vamos con el segundo ejemplo, haremos algo muy simple, un servidor que responda con un “Hola” a cualquier petición HTTP que se reciba, y al archivo lo llamaremos “servidorHola.js“:

var http = require('http');

var servidor = http.createServer(function (peticion, respuesta) {
  respuesta.writeHead(200, {'Content-Type': 'text/plain'});
  respuesta.end('Hola\n');
});

servidor.listen(1337, '127.0.0.1');

console.log('Servidor funcionando en http://127.0.0.1:1337/');

Para ponerlo en marcha utiliza el siguiente comando desde el Shell:

> node servidorHola.js
Servidor funcionando en http://127.0.0.1:1337/

En el código hemos usado el citado módulo http para crear el servidor, que hemos referenciado usando la función require(). Cuando creamos un servidor tenemos que pasarle una función que servirá para definir el comportamiento en caso de que haya una llamada HTTP, es decir, cuál será la respuesta que se devolverá dependiendo de cuál sea la petición. Esa función la he puesto en color azul para diferenciarla bien, luego volveremos a ella. Una vez que hemos definido el funcionamiento, ponemos el servidor a escuchar la IP 127.0.0.1 (localhost) y el puerto 1337 (sí, muy original) mediante el método listen(). La última línea sólo sirve para mostrar un cartel en la consola indicando que el servidor está en marcha.

Viendo esto es evidente que el auténtico corazón de nuestro servidor, es la función azul que le hemos pasado como argumento a createServer() y que se encarga de manejar las peticiones. Fíjate que recibimos un objeto llamado petición y un objeto llamado respuesta. En la petición tenemos todo lo necesario para saber qué nos están pidiendo (url, cabeceras… ) y el objeto respuesta nos sirve para construir… pues eso, la respuesta. Nuestra función es tan simple que da igual la petición que se haga, porque siempre devuelve lo mismo. Prueba a poner cualquiera de estas cosas en el navegador, y verás que siempre recibes un “Hola“:

http://localhost:1337/index.php
http://localhost:1337/background.jpg
http://localhost:1337/uno/dos/tres/cuatro.html

Si queremos distinguir las peticiones para poder ofrecer distintas respuestas, tendremos que echarle un vistazo a ese argumento que he llamado “peticion” y que será un objeto de tipo http.IncomingMessage. Como ejemplo sencillo, vamos a cambiar la línea donde escribimos “Hola” por esta otra:

respuesta.end('Hola\nParece que quieres cargar: '+peticion.url);

Así, además de escribir el saludo, también nos mostrará qué es lo que el usuario está intentando cargar. Usando esto, y trabajándolo un poco, podemos crear todo un sistema de enrutamiento con el que detectar qué se pretende cargar y devolver el contenido correcto… pero no haremos nada de eso porque si empezamos por ahí el esfuerzo puede llegar a ser gigantesco. Ten en cuenta que además de las rutas, hay que manejar las variables GET, las variables POST, Sesiones, redirecciones 301, Cookies… montón de cosas que PHP ya tiene integradas desde el primer momento y sin molestias para el programador, pero con NodeJS tenemos que construirlo nosotros. De todas formas, no te preocupes porque hay soluciones (frameworks) que te proporcionarán todo lo que necesites como por ejemplo Express, que uno de los más famosos. Si quieres saber algo más de ExpressJS, al final de este artículo tienes un enlace que seguro que te interesará.

Antes de acabar, lo que sí vamos a construir es un servidor de recursos estáticos. Para esto no nos hace falta ninguna de las cosas complejas mencionadas antes. Se trata de algo tan simple como que si se pide un archivo que existe, se sirve, y si no existe, pues nada. Esto es casi tan fácil de hacer como lo que ya tenemos, y nos vendrá bien por si algún día queremos hacer un servidor de recursos con pocas líneas.

Para hacer este servidor estático, necesitamos una nueva librería de NodeJS y que se llama “node-static“. Aquí va el código y ahora lo comentamos:

var http = require('http');
var nodeStatic = require('node-static');
var archivo = new nodeStatic.Server();
var servidor = http.createServer(function (peticion, respuesta) {
  archivo.serve(peticion, respuesta);
});
servidor.listen(1337, '127.0.0.1');
console.log('Servidor funcionando en http://127.0.0.1:1337/');

Las cosas que son distintas las he puesto de color azul para distinguirlas. Fíjate que hacemos el require de “node-static” y con la librería creamos un servidor de archivos que hemos llamado “archivo“. Dentro de la función que se encarga de generar el contenido de respuesta, hemos metido este servidor de archivos que recibirá la petición y el objeto de respuesta para que se encargue él. Trata de poner en marcha este servidor: (quizás tengas que detener el otro primero pulsando CTRL+c)

> node servidorEstatico.js

…y con toda seguridad tendrás un error en la pantalla. Esto se debe a que el módulo “http” es de tipo built-in, es decir, que viene por defecto dentro de NodeJS, pero el módulo “node-static” no y primero tendremos que instalarlo con el NPM. Instala el paquete con este comando y luego intenta poner en marcha otra vez el servidor:

> npm install node-static

Ahora sí que debe estar todo bien, pero para poder probar bien cómo funciona esto, deberías meter algunos archivos dentro de la carpeta del proyecto, por ejemplo un “background.jpg” y un “readme.txt“. Cualquier imagen y cualquier texto servirá para la prueba. Y ahora pon estas URLs en el navegador:

http://localhost:1337/readme.txt
http://localhost:1337/background.jpg
http://localhost:1337/index.php

Mientras que la tercera dirección no devolverá nada, las otras sí. Y si hubiese una estructura de carpetas, también funcionaría correctamente. Así que ya tenemos nuestro servidor de recursos en marcha.

Por ahora hemos terminado con estos primeros pasos de NodeJS. Si te estás preguntando qué hostings puedes encontrar en Internet que sean compatibles con NodeJS para empezar a hacer cosas en serio, te paso este enlace donde viene una lista (supuestamente actualizada):
https://github.com/joyent/node/wiki/Node-Hosting

Y si quieres seguir adentrándote en el mundo de hacer páginas webs con NodeJS, te vendrá bien este artículo: Introducción a ExpressJS para NodeJS

Share on FacebookShare on Google+Tweet about this on TwitterShare on LinkedIn

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *