- Crear un web server con Express
- Servir contenido estático
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
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.
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).
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');
});
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.
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 sonallow
,deny
eignore
(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 encabezadoLast-Modified
con la fecha de modificación del archivo.maxAge
define el valor en milisegundos de la propiedadmax-age
del encabezadoCache-Control
. El valor por defecto es0
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.
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 puertoapp.use()
monta middlewaresapp.get()
sirve pedidos HTTP GETapp.post()
sirve pedidos HTTP POSTapp.put()
sirve pedidos HTTP PUTapp.delete()
sirve pedidos HTTP DELETEapp.all()
sirve cualquier pedido (verbo) HTTP
- Sitio web de Express
- Documentación de express.static
- Artículo de Wikipedia sobre HTTP ETags