Esta traducci贸n proporcionada por StrongLoop / IBM.

Este documento puede estar desfasado respecto a la documentaci贸n en ingl茅s. Para ver las 煤ltimas actualizaciones, consulte la documentaci贸n en ingl茅s.

Utilizaci贸n del middleware

Express es una infraestructura web de direccionamiento y middleware que tiene una funcionalidad m铆nima propia: una aplicaci贸n Express es fundamentalmente una serie de llamadas a funciones de middleware.

Las funciones de middleware son funciones que tienen acceso al objeto de solicitud (req), al objeto de respuesta (res) y a la siguiente funci贸n de middleware en el ciclo de solicitud/respuestas de la aplicaci贸n. La siguiente funci贸n de middleware se denota normalmente con una variable denominada next.

Las funciones de middleware pueden realizar las siguientes tareas:

Si la funci贸n de middleware actual no finaliza el ciclo de solicitud/respuestas, debe invocar next() para pasar el control a la siguiente funci贸n de middleware. De lo contrario, la solicitud quedar谩 colgada.

Una aplicaci贸n Express puede utilizar los siguientes tipos de middleware:

Puede cargar middleware de nivel de aplicaci贸n y de nivel de direccionador con una v铆a de acceso de montaje opcional. Tambi茅n puede cargar una serie de funciones de middleware a la vez, lo que crea una subpila del sistema de middleware en un punto de montaje.

Middleware de nivel de aplicaci贸n

Enlace el middleware de nivel de aplicaci贸n a una instancia del objeto de aplicaci贸n utilizando las funciones app.use() y app.METHOD(), donde METHOD es el m茅todo HTTP de la solicitud que maneja la funci贸n de middleware (por ejemplo, GET, PUT o POST) en min煤sculas.

Este ejemplo muestra una funci贸n de middleware sin ninguna v铆a de acceso de montaje. La funci贸n se ejecuta cada vez que la aplicaci贸n recibe una solicitud.


var app = express();

app.use(function (req, res, next) {
  console.log('Time:', Date.now());
  next();
});

Este ejemplo muestra una funci贸n de middleware montada en la v铆a de acceso /user/:id. La funci贸n se ejecuta para cualquier tipo de solicitud HTTP en la v铆a de acceso /user/:id.


app.use('/user/:id', function (req, res, next) {
  console.log('Request Type:', req.method);
  next();
});

Este ejemplo muestra una ruta y su funci贸n de manejador (sistema de middleware). La funci贸n maneja las solicitudes GET a la v铆a de acceso /user/:id.


app.get('/user/:id', function (req, res, next) {
  res.send('USER');
});

A continuaci贸n, se muestra un ejemplo de carga de una serie de funciones de middleware en un punto de montaje, con una v铆a de acceso de montaje. Ilustra una subpila de middleware que imprime informaci贸n de solicitud para cualquier tipo de solicitud HTTP en la v铆a de acceso /user/:id.


app.use('/user/:id', function(req, res, next) {
  console.log('Request URL:', req.originalUrl);
  next();
}, function (req, res, next) {
  console.log('Request Type:', req.method);
  next();
});

Los manejadores de rutas permiten definir varias rutas para una v铆a de acceso. El ejemplo siguiente define dos rutas para las solicitudes GET a la v铆a de acceso /user/:id. La segunda ruta no dar谩 ning煤n problema, pero nunca se invocar谩, ya que la primera ruta finaliza el ciclo de solicitud/respuestas.

Este ejemplo muestra una subpila de middleware que maneja solicitudes GET a la v铆a de acceso /user/:id.


app.get('/user/:id', function (req, res, next) {
  console.log('ID:', req.params.id);
  next();
}, function (req, res, next) {
  res.send('User Info');
});

// handler for the /user/:id path, which prints the user ID
app.get('/user/:id', function (req, res, next) {
  res.end(req.params.id);
});

Para omitir el resto de las funciones de middleware de una pila de middleware de direccionador, invoque next('route') para pasar el control a la siguiente ruta. NOTA: next('route') s贸lo funcionar谩 en las funciones de middleware que se hayan cargado utilizando las funciones app.METHOD() o router.METHOD().

Este ejemplo muestra una subpila de middleware que maneja solicitudes GET a la v铆a de acceso /user/:id.


app.get('/user/:id', function (req, res, next) {
  // if the user ID is 0, skip to the next route
  if (req.params.id == 0) next('route');
  // otherwise pass the control to the next middleware function in this stack
  else next(); //
}, function (req, res, next) {
  // render a regular page
  res.render('regular');
});

// handler for the /user/:id path, which renders a special page
app.get('/user/:id', function (req, res, next) {
  res.render('special');
});

Middleware de nivel de direccionador

El middleware de nivel de direccionador funciona de la misma manera que el middleware de nivel de aplicaci贸n, excepto que est谩 enlazado a una instancia de express.Router().


var router = express.Router();

Cargue el middleware de nivel de direccionador utilizando las funciones router.use() y router.METHOD().

El siguiente c贸digo de ejemplo replica el sistema de middleware que se ha mostrado anteriormente para el middleware de nivel de aplicaci贸n, utilizando el middleware de nivel de direccionador:


var app = express();
var router = express.Router();

// a middleware function with no mount path. This code is executed for every request to the router
router.use(function (req, res, next) {
  console.log('Time:', Date.now());
  next();
});

// a middleware sub-stack shows request info for any type of HTTP request to the /user/:id path
router.use('/user/:id', function(req, res, next) {
  console.log('Request URL:', req.originalUrl);
  next();
}, function (req, res, next) {
  console.log('Request Type:', req.method);
  next();
});

// a middleware sub-stack that handles GET requests to the /user/:id path
router.get('/user/:id', function (req, res, next) {
  // if the user ID is 0, skip to the next router
  if (req.params.id == 0) next('route');
  // otherwise pass control to the next middleware function in this stack
  else next(); //
}, function (req, res, next) {
  // render a regular page
  res.render('regular');
});

// handler for the /user/:id path, which renders a special page
router.get('/user/:id', function (req, res, next) {
  console.log(req.params.id);
  res.render('special');
});

// mount the router on the app
app.use('/', router);

Middleware de manejo de errores

El middleware de manejo de errores siempre utiliza cuatro argumentos. Debe proporcionar cuatro argumentos para identificarlo como una funci贸n de middleware de manejo de errores. Aunque no necesite utilizar el objeto next, debe especificarlo para mantener la firma. De lo contrario, el objeto next se interpretar谩 como middleware normal y no podr谩 manejar errores.

Defina las funciones de middleware de manejo de errores de la misma forma que otras funciones de middleware, excepto con cuatro argumentos en lugar de tres, espec铆ficamente con la firma (err, req, res, next):


app.use(function(err, req, res, next) {
  console.error(err.stack);
  res.status(500).send('Something broke!');
});

Para obtener detalles sobre el middleware de manejo de errores, consulte: Manejo de errores.

Middleware incorporado

Desde la versi贸n 4.x, Express ya no depende de Connect. Excepto express.static, todas las funciones de middleware que se inclu铆an previamente con Express est谩n ahora en m贸dulos diferentes. Consulte la lista de funciones de middleware.

express.static(root, [options])

La 煤nica funci贸n de middleware incorporado en Express es express.static. Esta funci贸n se basa en serve-static y es responsable del servicio de activos est谩ticos de una aplicaci贸n Express.

El argumento root especifica el directorio ra铆z desde el que se realiza el servicio de activos est谩ticos.

El objeto options opcional puede tener las siguientes propiedades:

Propiedad Descripci贸n Tipo Valor predeterminado
dotfiles Opci贸n para el servicio de dotfiles. Los valores posibles son 鈥渁llow鈥, 鈥渄eny鈥 e 鈥渋gnore鈥 Serie 鈥渋gnore鈥
etag Habilitar o inhabilitar la generaci贸n de etag Booleano true
extensions Establece las reservas de extensiones de archivos. Matriz []
index Env铆a el archivo de 铆ndices de directorios. Establ茅zcalo en false para inhabilitar la indexaci贸n de directorios. Mixto 鈥渋ndex.html鈥
lastModified Establezca la cabecera Last-Modified en la 煤ltima fecha de modificaci贸n del archivo en el sistema operativo. Los valores posibles son true o false. Booleano true
maxAge Establezca la propiedad max-age de la cabecera Cache-Control en milisegundos o una serie en formato ms N煤mero 0
redirect Redireccionar a la 鈥/鈥 final cuando el nombre de v铆a de acceso es un directorio. Booleano true
setHeaders Funci贸n para establecer las cabeceras HTTP que se sirven con el archivo. Funci贸n

A continuaci贸n, se muestra un ejemplo de uso de la funci贸n de middleware express.static con un objeto de opciones elaboradas:


var options = {
  dotfiles: 'ignore',
  etag: false,
  extensions: ['htm', 'html'],
  index: false,
  maxAge: '1d',
  redirect: false,
  setHeaders: function (res, path, stat) {
    res.set('x-timestamp', Date.now());
  }
}

app.use(express.static('public', options));

Puede tener m谩s de un directorio est谩tico para cada aplicaci贸n:


app.use(express.static('public'));
app.use(express.static('uploads'));
app.use(express.static('files'));

Para obtener m谩s detalles sobre la funci贸n serve-static y sus opciones, consulte la documentaci贸n de serve-static.

Middleware de terceros

Utilice el middleware de terceros para a帽adir funcionalidad a las aplicaciones Express.

Instale el m贸dulo Node.js para la funcionalidad necesaria y c谩rguelo en la aplicaci贸n a nivel de aplicaci贸n o a nivel de direccionador.

El siguiente ejemplo ilustra la instalaci贸n y carga de la funci贸n de middleware de an谩lisis de cookies cookie-parser.


$ npm install cookie-parser


var express = require('express');
var app = express();
var cookieParser = require('cookie-parser');

// load the cookie-parsing middleware
app.use(cookieParser());

Para ver una lista parcial de las funciones de middleware de terceros que m谩s se utilizan con Express, consulte: Middleware de terceros.