Articles

Uso del middleware

Posted on

Express es un framework web de enrutamiento y middleware que tiene una funcionalidad mínima propia: Una aplicación Express es esencialmente 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 solicitud-respuesta de la aplicación. La siguiente función de middleware se denota comúnmente por una variable llamada next.

Las funciones de middleware pueden realizar las siguientes tareas:

  • Ejecutar cualquier código.
  • Hacer cambios en los objetos de solicitud y respuesta.
  • Finalizar el ciclo petición-respuesta.
  • Llamar a la siguiente función middleware de la pila.
    • Si la función middleware actual no finaliza el ciclo petición-respuesta, debe llamar a next() para pasar el control a la siguiente función middleware. De lo contrario, la petición se quedará colgada.

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

      • Midware de nivel de aplicación
      • Midware de nivel de enrutador
      • Midware de gestión de errores
      • Midware incorporado
      • Midware de terceros
      • Puede cargar middleware de nivel de aplicación y de nivel de enrutador con una ruta de montaje opcional.También puede cargar una serie de funciones de middleware juntas, lo que crea una subpila del sistema de middleware en un punto de montaje.

        Middleware de nivel de aplicación

        Enlaza middleware de nivel de aplicación a una instancia del objeto app utilizando las funciones app.use() y app.METHOD(), donde METHOD es el método HTTP de la petición que maneja la función del middleware (como GET, PUT o POST) en minúsculas.

        Este ejemplo muestra una función middleware sin ruta de montaje. La función se ejecuta cada vez que la app recibe una petición.

var express = require('express')var app = express()app.use(function (req, res, next) { console.log('Time:', Date.now()) next()})

Este ejemplo muestra una función middleware montada en la ruta /user/:id. La función se ejecuta para cualquier tipo de peticiónHTTP en la ruta /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 manejadora (sistema middleware). La función maneja peticiones GET a la /user/:id ruta.

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

Aquí se muestra un ejemplo de carga de una serie de funciones middleware en un punto de montaje, con una ruta de montaje.Ilustra una subpila de middleware que imprime la información de la petición para cualquier tipo de petición HTTP a la /user/:id ruta.

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 ruta permiten definir múltiples rutas para una ruta. El ejemplo siguiente define dos rutas para las peticiones GET a la ruta /user/:id. La segunda ruta no causará ningún problema, pero nunca será llamada porque la primera ruta termina el ciclo de solicitud-respuesta.

Este ejemplo muestra una subpila de middleware que maneja las solicitudes GET a la ruta /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 IDapp.get('/user/:id', function (req, res, next) { res.send(req.params.id)})

Para omitir el resto de las funciones de middleware de una pila de middleware del router, llama a next('route') para pasar el control a la siguiente ruta.NOTA: next('route') sólo funcionará en las funciones de middleware que se cargaron utilizando las funciones app.METHOD() o router.METHOD().

Este ejemplo muestra una subpila de middleware que gestiona las peticiones GET a la ruta /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) { // send a regular response res.send('regular')})// handler for the /user/:id path, which sends a special responseapp.get('/user/:id', function (req, res, next) { res.send('special')})

El middleware también puede declararse en un array para su reutilización.

Este ejemplo muestra un array con una subpila de middleware que gestiona las peticiones GET a la /user/:id ruta

function logOriginalUrl (req, res, next) { console.log('Request URL:', req.originalUrl) next()}function logMethod (req, res, next) { console.log('Request Type:', req.method) next()}var logStuff = app.get('/user/:id', logStuff, function (req, res, next) { res.send('User Info')})

Middleware a nivel de router

El middleware a nivel de router funciona de la misma manera que el middleware a nivel de aplicación, excepto que está vinculado a una instancia de express.Router().

var router = express.Router()

Carga el middleware a nivel de router utilizando las funciones router.use() y router.METHOD().

El siguiente código de ejemplo replica el sistema de middleware que se muestra arriba para el middleware a nivel de aplicación, utilizando el middleware a nivel de router:

var express = require('express')var app = express()var router = express.Router()// a middleware function with no mount path. This code is executed for every request to the routerrouter.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 pathrouter.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 pathrouter.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 pagerouter.get('/user/:id', function (req, res, next) { console.log(req.params.id) res.render('special')})// mount the router on the appapp.use('/', router)

Para omitir el resto de las funciones de middleware del router, llama a next('router') para pasar el control de nuevo fuera de la instancia del router.

Este ejemplo muestra una subpila de middleware que gestiona las peticiones GET a la ruta /user/:id.

var express = require('express')var app = express()var router = express.Router()// predicate the router with a check and bail out when neededrouter.use(function (req, res, next) { if (!req.headers) return next('router') next()})router.get('/user/:id', function (req, res) { res.send('hello, user!')})// use the router and 401 anything falling throughapp.use('/admin', router, function (req, res) { res.sendStatus(401)})

Medio de gestión de errores

El middleware de gestión de errores siempre toma cuatro argumentos. Debes proporcionar cuatro argumentos para identificarla como una función de middleware de gestión de errores. Incluso si no necesitas usar el objeto next, debes especificarlo para mantener la firma. De lo contrario, el objeto next se interpretará como un middleware normal y no podrá manejar los errores.

Define las funciones de middleware de manejo de errores de la misma manera 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 más detalles sobre el middleware de manejo de errores, ver: Manejo de errores.

Medioware incorporado

A partir de la versión 4.x, Express ya no depende de Connect. Las funciones de middleware que antes se incluían con Express están ahora en módulos separados; consulte la lista de funciones de middleware.

Express tiene las siguientes funciones de middleware incorporadas:

  • express.static sirve activos estáticos como archivos HTML, imágenes, etc.
  • express.json analiza las solicitudes entrantes con cargas útiles JSON. NOTA: Disponible con Express 4.16.0+
  • express.urlencoded analiza las peticiones entrantes con cargas útiles codificadas en URL. NOTA: Disponible con Express 4.16.0+

Medio de terceros

Utiliza medio de terceros para añadir funcionalidad a las apps de Express.

Instala el módulo de Node.js para la funcionalidad requerida, y luego cárgalo en tu app a nivel de aplicación o a nivel de router.

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 middlewareapp.use(cookieParser())

Para obtener una lista parcial de funciones de middleware de terceros que se utilizan habitualmente con Express, consulte: Middleware de terceros.

Deja una respuesta

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