Crear un servidor web con Node.js y Express

16 Mar
Published by fernando.villalobos in

Tags 

Node.js

¿Qué es Node.js?

Node.js es una plataforma Javascript que ha tenido mucho eco últimamente en el ambiente de desarrollo de aplicaciones web, está construido sobre V8, los runtimes para Javascript de Google. Algunos de los puntos importantes sobre Node.js es que, a pesar de ser una librería Javascript, los scripts Node.js están diseñados para correr del lado del servidor brindando todas la ventajas de la programación orientada a eventos event-driven propia de Javascript además de un rendimiento bastante bueno al momento de la ejecución.

Pre requisitos: Node.js y npm

Antes de comenzar con la codificación de nuestro servidor web, requerimos instalar un par de paquetes en nuestro equipo:

  • Node.js: La plataforma Javascript
  • npm: Node Package Manager, el manejador de paquetes de Node.js

Para nuestra buena fortuna, casi todas las distribuciones Linux ya vienen con el paquete llamado nodejs en los repositorios; en caso de querer instalar una versión diferente a la proveniente del repositorio, pueden descargarlo aquí. Además, npm ya viene instalado en versiones resientes de Node.js, entonces, si llegaste a esta línea del post, ya tienes todo listo para levantar tu primer servidor web en Javascript (¡Yei!).

Configuración del proyecto: package.json

Todo proyecto Node requiere tener un archivo de configuración, el cual nos da la definición de paquetes y versiones a utilizar en el proyecto. Para este post utilizaremos el paquete express, ya sea que queramos desarrollar un pequeño servidor web o una robusta API, express nos será útil.

El archivo package.json queda como sigue y creo que se explica por sí mismo:

{
  "name": "miWebServer",
  "description": "Servidor web de prueba",
  "version": "1.0.0",
  "dependencies": {
    "express": "3.x"
  }
}

El nodo más importante es el dependencies, indicando paquetes y versiones, para los que utilizamos Ruby on Rails, este nodo cumpliría una función similar al archivo Gemfile de bundler.

Con nuestro archivo de configuración creado, basta con pedirle (amablemente) a Node Package Manager que instale las dependencias de nuestro proyecto:

npm install

Ésto creará un directorio llamado node_modules donde se instalarán las dependencias de nuestro proyecto; si no me crees, puedes correr el comando npm ls para ver el árbol de dependencias de tu nuevo proyecto:

$ npm ls
miWebServer@1.0.0 /home/fernando/logicalbricks/dev/js/mi_web_server
└─┬ express@3.1.0
  ├── buffer-crc32@0.1.1
  ├── commander@0.6.1
  ├─┬ connect@2.7.2
  │ ├── bytes@0.1.0
  │ ├── formidable@1.0.11
  │ ├── pause@0.0.1
  │ └── qs@0.5.1
  ├── cookie@0.0.5
  ├── cookie-signature@0.0.1
  ├── debug@0.7.2
  ├── fresh@0.1.0
  ├── methods@0.0.1
  ├── mkdirp@0.3.3
  ├── range-parser@0.0.4
  └─┬ send@0.1.0
    └── mime@1.2.6

Servidor web: server.js

Crear nuestro pequeño servidor web es tan fácil como importar, crear, rutear y escuchar, aquí el script para realizar estos cuatro pasos:

  1. // importar
  2. var express = require('express');
  3.  
  4. // instanciar
  5. var app = express();
  6.  
  7. // ruteo
  8. app.get('/', function(req, res){
  9. res.sendfile(__dirname + '/public/index.html');
  10. });
  11. app.get('/about', function(req, res){
  12. res.sendfile(__dirname + '/public/about.html');
  13. });
  14.  
  15. // escuchar
  16. app.listen(9000);
  17.  
  18. console.log("Servidor Express escuchando en modo %s", app.settings.env);

Por último, el comando a ejecutar desde consola para ver nuestro script en ejecución:

$ node server.js

El script anterior lanzará una aplicación escuchando al puerto 9000 y responderá a las siguientes URLs:

La magia está en la sección de ruteo, la función get recibe como primer parámetro la ruta a parsear, y como segundo parámetro una función de callback que recibe el objeto del request y la respuesta res que devolveremos al navegador. En esta función de callback podemos hacer cualquier procesamiento necesario para generar una respuesta, la cual deberá ser cargada sobre el objeto res. A continuación unos ejemplos de respuestas:

Respuesta en texto

Parsea la url /hola.txt y devuelve respuesta en texto

app.get('/hola.txt', function(req, res){
  res.send('Hola mundo');
});

Respuesta en html

Parsea la url /hola.html y devuelve respuesta en html cargada desde el archivo 'hola.html'

app.get('/hola.html', function(req, res){
  res.sendfile(__dirname + '/hola.html');
});

Respuesta en JSON

Parsea la url /hola.json y devuelve respuesta en formato JSON cargada desde el archivo 'hola.json'

app.get('/hola.json', function(req, res){
  // Indicamos el tipo de contenido a devolver en las cabeceras de nuestra respuesta
  res.contentType('application/json');
  res.sendfile(__dirname + '/hola.json');
});

Como podemos ver en los últimos dos casos, hacemos uso de la variable __dirname creada automáticamente por Node y contiene la ruta en la cuál se está ejecutando nuestro script.

Espero les sea de utilidad (yo lo uso para prototipado de aplicaciones que requieran respuestas AJAX).