MEAN: Node.js y Express

Siguiendo con la serie de artículos dedicados al stack MEAN, me dispongo a explicar brevemente las características de Node.js y Express, una infraestructura perfecta para empezar. En esta ocasión no entraré en demasiados detalles, y me limitaré a describir las tecnologías poniendo ejemplos simples que en artículos posteriores desarrollaré con ejemplos, una vez haya presentado todas las tecnologías del stack.

Tabla de Contenidos

Node.js

JavaScript nació en el lado servidor casi al mismo tiempo que en el navegador. La propia empresa que creó el lenguaje, Netscape, lo incluyó también en su servidor web llamado Netscape Enterprise Server, aunque con poco éxito. Poco después Microsoft lo incorporó a su ASP clásico, donde todavía funciona.

No es sin embargo hasta hace relativamente poco, en 2009, cuando un proyecto empezó a poner en el mapa realmente a JavaScript en el lado servidor. Se trata de Node.js, un entorno de ejecución de aplicaciones multiplataforma y de código abierto (Open Source).

Node.js utiliza el motor de JavaScript de Google, denominado V8, y provee una arquitectura orientada a eventos (como la de los navegadores) así como una serie de APIs no-bloqueantes (asíncronas) que le proporcionan un rendimiento y una escalabilidad muy elevadas. Se puede utilizar para crear cualquier tipo de lógica de aplicación, pero dado que incorpora un módulo para poder actuar como un servidor web, es especialmente popular para crear aplicaciones web. Actualmente lo emplean para sus aplicaciones multitud de empresas de todos los ámbitos pero especialmente de Internet: PayPal, SAP, Groupon e incluso la mismísima Microsoft.

Gracias a Node.js se pueden crear gratuitamente aplicaciones web de alto rendimiento, en cualquier sistema operativo y utilizando como único lenguaje de programación JavaScript.

npm

Node.js cuenta con un repositorio de paquetes que incluye diferentes recursos para utilizar en la creación de aplicaciones. Para acceder a ese repositorio se utiliza el administrador de paquetes denominado npm, el cual nos permite instalar y actualizar innumerables recursos creados por diferentes desarrolladores. Además, permite crear nuestros propios paquetes y recursos de código para poder reutilizarlos y compartirlos con la comunidad.

Cada vez que instalamos un paquete en nuestra aplicación, se añadirá información relacionada en un fichero denominado package.json. Este fichero incluye toda la información importante de una aplicación Node.js en formato JSON, como el nombre y descripción de la misma, la versión actual, el tipo de licencia del mismo, y lo que es más importante, las dependencias necesarias de otros paquetes. Esto nos permite crear paquetes que podremos reutilizar en otras aplicaciones añadiendo éstos como dependencia en el fichero package.json de la nueva aplicación, así como modificar las versiones de las dependencias y demás propiedades importantes.

En el Fragmento de Código 1 podemos ver el fichero package.json de una aplicación web básica. Como podemos observar, existen algunos parámetros que son relativos a la aplicación en sí, como el nombre, la versión o la visibilidad del paquete. Otros más avanzados como scripts, que nos permite introducir comandos habituales en nuestra aplicación, lo cual nos facilitará algunas tareas comunes. Finalmente, la propiedad dependencies, como podemos deducir, incluye los nombres de los paquetes necesarios así como la versión de los mismos.

{
  "name": "nombreaplicacion",
  "version": "1.0.0",
  "private": false,
  "scripts": {
    "start": "node ./bin/www"
  },
  "dependencies": {
    "body-parser": "~1.13.2",
    "cookie-parser": "~1.3.5",
    "debug": "~2.2.0",
    "express": "~4.13.1",
    "jade": "~1.11.0",
    "morgan": "~1.6.1",
    "serve-favicon": "~2.3.0"
  }
}

Las versiones de los paquetes incluyen algunos modificadores que nos permitirán actualizar los paquetes conforme vayan saliendo nuevas versiones, o mantener las versiones específicas de forma estricta. Los modificadores de versión más habituales son los siguientes:

  • >=: Versiones mayores o iguales a una versión concreta. Por ejemplo >=1.3 instalará todas las versiones superiores a la 1.3 sin distinción.
  • ~: Actualizaciones de la rama de la versión especificada. Por ejemplo ~1.3 indicará que se permiten actualizaciones de versiones del tipo 1.3.2, pero en caso de que el paquete se actualizara a la versión 1.4, ésta actualización sería ignorada.

Todos los paquetes que instalemos a través de npm se instalarán en la carpeta node_modules. De esta forma, en caso de que quisiéramos compartir nuestro paquete en un repositorio, o simplemente distribuirlo de forma manual, podríamos ignorar esa carpeta, ya que ejecutando el comando “npm install” se crearía automáticamente la carpeta node_modules y se descargarían del repositorio todas las dependencias indicadas en el fichero package.json. Del mismo modo, en caso de que quisiéramos actualizar las dependencias a versiones más actuales, el comando a utilizar sería “npm update”.

Una forma de utilizar estos paquetes en una aplicación es utilizando la función require, que recibe como parámetro una cadena de texto con el nombre del paquete instalado a utilizar, devolviendo un objeto que contendrá los métodos y valores correspondientes que podremos utilizar.

Servidor HTTP

Una vez instalemos Node.js en el sistema, podremos crear un servidor web completamente funcional definiéndolo en un fichero de texto utilizando los componentes connect y serve-static como podemos ver en el Fragmento de Código 2. El componente connect nos permitirá crear una instancia de servidor HTTP que se encargará de manejar las peticiones en un puerto determinado, mientras que serve-static permitirá a este servidor mostrar ficheros estáticos HTML situados en la misma carpeta del fichero app.js de definición de la aplicación (_dirname) o en cualquier otra carpeta que se le pase por parámetro a este componente en su definición.

var connect = require('connect');
var serveStatic = require('serve-static');
connect().use(serveStatic(__dirname)).listen(1337, function(){
    console.log('Servidor ejecutándose en http://localhost:1337/');
});

Para iniciar el servidor tan solo hay que ejecutar el fichero con node como podemos ver en el Fragmento de Código 3. De esta forma podríamos acceder a los ficheros HTML de la carpeta mediante un navegador en la URL http://localhost:1337/fichero.html.

node app.js

Existen múltiples formas de crear un servidor en Node.js, así como numerosas extensiones a las que podremos acceder con el ya mencionado administrador de paquetes para crear diferentes tipos de aplicación.

Node.js y MongoDB

Como vimos en la descripción de MongoDB, existe una pequeña diferencia a la hora de utilizar este sistema gestor de base de datos entre un sistema u otro, y es la forma de obtener un objeto de base de datos desde el que realizar las peticiones.

En Node.js podemos utilizar el paquete oficial mongodb para obtener una conexión a la base de datos y realizar peticiones similares a las vistas anteriormente utilizando un esquema de conexión parecido al del Fragmento de Código 4.

var MongoClient = require('mongodb').MongoClient;

var url = 'mongodb://localhost:27017/proyecto';

MongoClient.connect(url, function(err, db) {
	console.log("Conectado a la base de datos");
	var collection = db.collection('usuarios');
	var usuariosCursor = collection.find();
	while (usuariosCursor.hasNext()) {
		var usuario = usuariosCursor.next();
	}
	db.close();
});

Sin embargo, existen otras extensiones más elegantes como mongoose, que nos permite definir esquemas en JavaScript para facilitar la tarea de manejo de colecciones y mantener un código fuente más modular.

Express

Para ayudar a la creación de servidores y aplicaciones web se crearon diferentes infraestructuras que facilitaban esta tarea. Entre éstas destaca Express, que forma parte del conjunto de aplicaciones MEAN, que explicaremos a continuación.

Como hemos explicado anteriormente, Node.js es el entorno ideal para crear la lógica de un gran número de tipos de aplicaciones, y puesto que posee un módulo para controlar el protocolo HTTP, es posible crear aplicaciones web de forma sencilla. Sin embargo, para aplicaciones web medianamente complejas resulta muy laborioso y complejo desarrollar toda la lógica inicial de una aplicación web haciendo uso de Node.js sin ninguna metodología o infraestructura.

Haciendo uso de npm, Express se puede instalar de forma sencilla con el siguiente comando:

npm install express --save

Express es una infraestructura de aplicaciones web escrita en JavaScript para Node.js que nace con el propósito específico de crear aplicaciones web en este entorno. Ofrece soporte para las principales necesidades en este tipo de aplicaciones: gestión de peticiones y respuestas, cabeceras, rutas, vistas, etc. Además, cuenta con diferentes plantillas de aplicación que nos permite inicializar diferentes proyectos dependiendo de las necesidades específicas requeridas en cada caso.

Como puede verse en el Fragmento de Código 5 se pueden controlar diferentes tipos de petición HTTP estableciendo el patrón de la URL en el primer parámetro de la función, y la función de control en el segundo, que recibe como parámetros la propia petición, así como un objeto que nos permite establecer una respuesta. En el ejemplo del Fragmento de Código 5 podremos obtener las respuestas oportunas realizando las diferentes peticiones en las URL: http://localhost:3000/, http://localhost:3000/usuario y http://localhost:3000/cliente respectivamente.

var express = require('express');
var app = express();

app.get('/', function (req, res) {
  res.send('Hola Mundo!');
});
app.post('/', function (req, res) {
  res.send('Se ha realizado una petición POST');
});
app.put('/usuario', function (req, res) {
  res.send('Se ha realizado una petición PUT en /user');
});
app.delete('/cliente', function (req, res) {
  res.send('Se ha realizado una petición DELETE en /user');
});
app.listen(3000, function () {
  console.log('Ejemplo de aplicación escuchando en el puerto 3000!');
});

Sin embargo, Express cuenta con un generador de aplicaciones que nos permite crear una estructura de aplicación completa ejecutando un simple comando, evitándonos la tarea inicial de gestionar las diferentes peticiones más habituales. Esto facilita notablemente la tarea de crear aplicaciones siguiendo una estructura lógica de carpetas, separando conceptos en diferentes ficheros para hacer más modular el código. Mediante el siguiente comando se creará una estructura de carpetas como la que podemos ver en la Captura 1.

express nombreaplicacion
Estructura de carpetas de una aplicación generada con Node.js y Express

Captura 1: Estructura de carpetas de una aplicación generada con Express

Como podemos observar, entre los ficheros que se generan se encuentra el fichero package.json, el cual se corresponde con el que pudimos ver anteriormente en el Fragmento de Código 1, por tanto, para terminar de inicializar la aplicación debemos instalar las dependencias que indica este fichero mediante el ya mencionado comando “npm install”. Una vez instaladas las dependencias podremos iniciar la aplicación mediante el comando del Fragmento de Código 7 que ejecutará el script de inicialización contenido en el fichero package.json que ejecuta el fichero ./bin/www con la definición del servidor HTTP.

npm start

La definición de la aplicación la encontramos en el fichero app.js, en el que se incluyen, entre otras cosas, la definición dónde encontrar las rutas disponibles en la aplicación, así como gestión de errores y manejo de vistas. Cabe destacar que, por defecto, Express utiliza un motor de plantillas denominado Jade, el cual permite generar código HTML de forma dinámica mediante un lenguaje propio que permite reutilizar código de forma sencilla. Sin embargo, este lenguaje y su uso se escapa del contexto de nuestro propósito, por lo que no nos detendremos a detallar su funcionamiento. Encontraremos las definiciones de vistas en este lenguaje en los ficheros contenidos en la carpeta views.

Por otro lado, las rutas se encuentran estructuradas de forma modular en diferentes ficheros en la carpeta routes, donde podremos ver código similar al que pudimos ver en el Fragmento de Código 6.

En los próximos artículos partiremos de una aplicación web generada con Express con la estructura anteriormente vista, sin embargo, para procurar que nuestro servidor HTTP esté funcionando de forma constante en la máquina, y de esa manera pueda interactuar con otro tipo de servidores y aplicaciones instalados, haremos uso de la aplicación pm2, contenida en el repositorio de aplicaciones npm, que se encargará de mantener nuestra aplicación web ejecutándose de forma continua.

También te podría gustar...

Deja una respuesta

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