Skip to content

Instantly share code, notes, and snippets.

@gabmontes
Created September 29, 2015 01:39
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save gabmontes/e496a41f835bca65e99b to your computer and use it in GitHub Desktop.
Save gabmontes/e496a41f835bca65e99b to your computer and use it in GitHub Desktop.
Introducción a Express

Introducción a Express

Objetivos

  • Crear un web server con Express
  • Servir contenido estático

Qué es Express

Express es uno de los frameworks más utilizados para el desarrollo de servicos web con Node.js. Permite crear servicios que de manera modular y su funcionalidad puede ser extendida mediante el uso de middlewares.

Los casos de uso más comunes son:

  • Servir contenido web estático
  • Servir contenido web dinámicamente (mediante el uso de template engines)
  • Proveer servicios web (web services) SOAP
  • Proveer REST APIs

Instalación

Para crear una aplicación Node con Express, lo primero que conviene hacer es crear el archivo package.json y así comenzar a manejar las dependencias. Un JSON vacío es suficiente:

{}

Como Express está publicado como módulo en NPM, el comando npm install --save express instalará el módulo localmente en el directorio node_modules y actualizará el archivo package.json automáticamente.

Servior web básico

Un servidor web básico es uno que, por ejemplo, cuando se le solicite / (raíz del sitio web), responda con una cadena de texto predefinida. Esto muestra como Node.js y Express en conjunto pueden responder pedidos HTTP. Para hacerlo, se debe crear un archivo server.js con el siguiente contenido:

var express = require('express');

var app = express();

app.get('/', function (req, res) {
  res.send('Respuesta desde Express!');
});

var server = app.listen(3000, function () {
  console.log('Servidor web iniciado');
});

Una vez iniciado el servidor con node server.js, si con un navegador se accede a la dirección http://localhost:3000, se recibirá como respuesta Respuesta desde Express!.

Es importante tener presente que no pueden haber dos servicios activos trabajando sobre el mismo puerto en el mismo equipo. Asimismo, ciertos puertos pueden estar reservados por el sistema o necesitar privilegios elevados (se necesita permisos de root en Lunix para iniciar un servicio en el puerto 80).

Servir archivos estáticos

Un servidor web, a diferencia del servidor básico del punto anterior, dará acceso a una serie de archivos que se encuentran en el mismo sistema de archivos. El servidor, por lo tanto, debe:

  • recibir pedidos de diferentes rutas web,
  • transformar esos pedidos en rutas del sistema de archivos,
  • solicitar el contenido de los archivos al sistema operativo,
  • una vez obtenido, armar la respuesta al pedido original y enviarla o,
  • en caso de error, armar una respuesta de error y enviarla.

Al ser éste un proceso estándar y base para cualquier servidor web, Express provee una funcionalidad, middleware, que hacer todo lo anterior de manera automática. Los middlewares de Express son funciones que transforman los pedidos. En este caso, un pedido de la ruta /index.html se debe transformar en un pedido a un archivo del sistema de archivos del equipo, se lo debe solicitar, leer y responder.

Por lo tanto, dado un directorio www que contiene archivos index.html e index.css, el archivo server.js se podrá modificar para hacer uso de la funcionalidad y servir dicho contenido estático:

var express = require('express');

var app = express();

app.use(express.static('www'));

var server = app.listen(3000, function () {
  console.log('Servidor web iniciado');
});

Opciones de ubucación de archivos

Es posible configurar Express para que sirva más de un directorio de archivos. En ese caso, se debe configurar de la siguiente manera:

app.use(express.static('www'));
app.use(express.static('movil'));

Así, Express buscará los archivos solicitados en el directorio www y, si no los encuentra ahí, los buscará en el directorio movil: un pedido a /index.html se traducirá en el archivo www/index.html ó, de no existir, en movil/index.html. La búsqueda, entonces, se realiza en el orden en el que fueron agregador los middlewares.

También es posible definir prefijos en las rutas web y mapearlos con determinados directorios en el sistema de archivos:

app.use('/admin', express.static('admin'));

La línea anterior hará que cuando Express reciba un pedido a /admin/index.html, se traduzca apropiadamente en el archivo admin/index.html.

Finalmente, se puede easpecificar que los archivos no sean servidos desde un directorio relativo al directorio en el cual se está ejecutando el proceso de Node.js, sino que se puede especificar un directorio absoluto:

app.use(express.static('/sitios/www'));

En este caso, un pedido a /index.html hará que Express busque el archivo en la carpeta sitios de la raíz del sistema operativo, y dentro de ella, en la carpeta www, en vez de buscarla de forma relativa al lugar desde donde se inició el proceso.

Opciones del servicio de archivos

El middleware express.static recibe, entonces, dos parámetros. El primero es la raíz donde los archivos serán buscados. Opcionalmente se podrá ejecutar con un segundo parámetro de opciones con las sigueintes propiedades:

  • dotfiles especifica si se deben servir archivos que comienzan con un punto (.). Los valores son allow, deny e ignore (valor por defecto).
  • etag habilita (valor por defecto) o deshabilita la generación de ETags.
  • extensions habilita o deshabilita (valor por defecto) la transformación automática a otras extensiones de nombres de archivos.
  • index define el archivo que se enviará al solicitar un directorio, por ejemplo se enviará /index.html (valor por defecto) al pedir /.
  • lastModified envía (valor por defecto) o no el encabezado Last-Modified con la fecha de modificación del archivo.
  • maxAge define el valor en milisegundos de la propiedad max-age del encabezado Cache-Control. El valor por defecto es 0 y también acepta cadenas de texto ms.
  • redirect fuerza (valor por defecto) o no la redirección a la ruta que termina en / cuando la ruta solicitada es un directorio.
  • setHeaders es una función que sirve para dar valores a los encabezados que se envían en cada solicitud.

Opciones de arranque y configuración de Express

Para ver una lista detallada de las opciones de inicio y configuración de Express, remitirse a la documentación de express.Application.

Las funciones más destacadas son:

  • app.listen() vincula la aplicación con un puerto
  • app.use() monta middlewares
  • app.get() sirve pedidos HTTP GET
  • app.post() sirve pedidos HTTP POST
  • app.put() sirve pedidos HTTP PUT
  • app.delete() sirve pedidos HTTP DELETE
  • app.all() sirve cualquier pedido (verbo) HTTP

Recursos complementarios

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment