express: 4. middlewares

Explicación ladrillaka sobre qué son los middleware de express

Georgia Keeffe

archivado en: JavaScript / 13 octubre, 2015 / taller:

Sigo con la serie dedicada a express, un frame formidable para trabajar con node, y lo hago para hablar de un proceso un tanto abtruso, pero que una vez comprendido se maneja con facilidad. Me estoy refiriendo a los middlewares, que en el caso de express podríamos traducir como «cosas que se ponen entre medias de la petición del cliente (request) y la respuesta del servidor (response)».

Para que se entienda podemos pensar en una conversación normal entre dos personas, en la que una hace el papel de cliente y otra de servidor. Entremedias de los mensajes que comparten, el servidor puede usar co sas que afectan al mensaje, como usar un altavoz para amplificar la respuesta o usar un traductor universal como el que aparece en Star Trek o usar la mano en lugar de la voz para responder, sobre todo si es italiano. El altavoz, el traductor, la mano son middewares que puede usar el servidor. Así, por ejemplo, en la segunda entrada de esta serie vimos cómo usar un middleware para enviar una respuesta 404 cuando no existía la página solicitada:

app.use(function (req, res, next) {

res.status(404);

res.send('Ná, que no hay nada ahí');

});

Los middleware, por lo tanto, son funciones que podemos intercalar en las distintas etapas del ciclo de comunicación entre el ordenador y el cliente con la intención que sea. Esto, espero, que haya quedado claro, pero aún nos falta conocer otro concepto clave antes de entrar en materia y es el método next().

Pasando el relevo: next()

Como vimos, podemos preparar un mapeado de rutas para enviar (send) una cadena formidable cada vez que se solicite la url /foo.

app.get('/foo', function (req, res) {

res.send("Enviando foo");

});

Si utilizáramos un middleware sin más para esa solicitud, nunca llegaríamos a la fase response, pues el proceso se detendría en ahí. Es decir, así, nunca devolveríamos nuestra cadena.

app.use('/foo', function (req, res) {

console.log("foo Interceptado");

});

/* Nunca llegaríamos aquí */

app.get('/foo', function (req, res) {

res.send("Enviando foo");

});

Para evitar esto, en algunos middleware se utiliza el método next(), que se incorpora como parámetro a la función, y que sirve para decirle a express que después de haber hecho lo que sea, pase al siguiente (next) punto del proceso, es decir, a la siguiente función.

app.use('/foo', function (req, res, next) {

console.log("foo Interceptado, pero no detenido");

next();

});

Tipos de middleware

Los middlewares de express se agrupan en cinco grandes tipos según dónde se usen, su cometido y su procedencia. Estos son:

  • de aplicación
  • de rutas
  • de gestión de errores
  • core (built-in)
  • de terceros.

Ya los iremos viendo todos en detalle, pero así a vuelapluma para ir aterrizando en el tema:

1. De aplicación

Son middlewares ligados a la instancia en la que hemos cacheado la aplicación express y están relacionados con los métodos de la petición, de los que ya vimos algunos como put o get.

Por ejemplo, con estos middleware podríamos comprobar que algún parámetro de la query string es correcto.

/* http://localhost:3000/foo?id=33 */

var express = require("express");

var app = express();

app.use('/foo', function (req, res, next) {

/* Comprobamos que el id está bien... */

console.log("Comprobando el id: ", req.query.id);

/* Y si lo está, continuamos con el proceso */

next();

});

app.get('/foo', function (req, res) {

res.send("Enviando foo");

});

2. Rutas

Claro está, estos middlewares están relacionados con el mapeo de rutas. Funcionan de forma similar a los que acabamos de ver, pero están ligados al módulo router, que, como veremos en detalle más adelante, amplía las posibilidades del ruteo normal de express.

var express = require("express");

var app = express();

/* Cacheamos el módulo */

var router = express.Router();

/* Hacemos algo antes de enviar la respuesta, como banear ips de espamers */

router.use(function (req, res, next) {

console.log('ip:', req.ip);

next();

});

/* Enviamos los datos */

router.get('/*', function (req, res) {

res.send("Enviando respuesta");

});

/* Le decimos a express que use router para todas las rutas (*/) */

app.use('/*', router);

var server = app.listen(3000, function () {

console.log('Servidor levantado en el puerto 3000');

});

3. De errores

Estos middlewares sirven para gestionar los errores relacionados con las páginas no encontradas (los 400) y los que se producen en el servidor (los 500).

app.get('/foo', function (req, res) {

res.send("Enviando respuesta");

});

/* Si no nos piden foo enviamos un 404 */

app.use(function(req, res) {

res.send('404: Page not Found', 404);

});

/* .... */

app.get('/bar', function (req, res) {

/* Forzamos un error */

app.metodoInexistente();

res.send("Enviando respuesta");

});

/* Si los métodos anteriores cascan, notificamos el error */

app.use(function(err, req, res, next) {

res.status(500).send('Sa roto!');

});

4. Core (built-in)

Para hablar de este tipo de middlewares es necesario que antes recordemos la historia de Express. En sus orígenes, debajo de este frame había otro denominado connect, el cual se basaba a su vez en una colección de middlewares. Desde su versión 4, Express dejó de correr bajo connect, pero aún conserva un middlewares de aquel core... bueno, más bien una adaptación, que es static y sirve para gestionar algunos detalles de los recursos estáticos. No pondré un ejemplo, porque sin entrar en más detalle creo que solo llevaría a confusión.

5. De terceros

Por último, hay una montonera de middlewares desarrollados por terceros y que equivaldrían a los plugins de jQuery para entendernos. Valga como ejemplo el serve-favicon, que sirve para gestionar el famoso favicon.ico:

var express = require('express');

var favicon = require('serve-favicon');

var app = express();

app.use(favicon(__dirname + '/public/favicon.ico'));

...

En síntesis, los middleware son por lo tanto funciones con las que podemos ejecutar n acciones entremedias del ciclo de comunicación que se establece entre el cliente (request) y el servidor (response), un ciclo al que pueden poner fin o al que pueden dejar que siga fluyendo de forma natural mediante el método next().

Bueno, ha quedado una entrada un poco ladrillaka, pero creo que era necesaria antes de pasar a cosas más divertidas.

 

|| Tags: , , ,

valoración de los lectores sobre express: 4. middlewares

  • estrellica valoración positiva
  • estrellica valoración positiva
  • estrellica valoración positiva
  • estrellica valoración positiva
  • estrellica valoración positiva
  • 4.5 sobre 5 (2 votos)

¿Te ha parecido útil o interesante esta entrada?
dormido, valoración 1 nadapensativo, valoración 2 un poco sonrisa, valoración 3 a medias guiño, valoración 4 bastante aplauso, valoración 5 mucho

Tú opinión es muy importante, gracias por compartirla!

Los comentarios están cerrados.