Introducción
En el contexto de Express.js, el middleware es una función que tiene acceso al objeto de solicitud (req), al objeto de respuesta (res) y a la siguiente función de middleware en el ciclo de solicitud/respuesta de la aplicación. Estas funciones pueden realizar una variedad de tareas, como ejecutar código, modificar objetos de solicitud y respuesta, finalizar el ciclo de solicitud/respuesta y llamar a la siguiente función de middleware en la pila.
Conceptos Clave
- Funciones de Middleware: Son funciones que se ejecutan durante el ciclo de vida de una solicitud en una aplicación Express.
- Pila de Middleware: Las funciones de middleware se ejecutan en el orden en que se definen en la aplicación.
- next(): Es una función que se llama para pasar el control a la siguiente función de middleware.
Tipos de Middleware
- Middleware de Aplicación: Se aplica a toda la aplicación.
- Middleware de Ruta: Se aplica a rutas específicas.
- Middleware de Manejo de Errores: Se utiliza para manejar errores en la aplicación.
- Middleware Incorporado: Express tiene algunos middleware incorporados como
express.json()
yexpress.urlencoded()
. - Middleware de Terceros: Middleware proporcionado por terceros, como
body-parser
,morgan
, etc.
Ejemplo Práctico
Middleware de Aplicación
const express = require('express'); const app = express(); // Middleware de aplicación app.use((req, res, next) => { console.log('Tiempo:', Date.now()); next(); }); app.get('/', (req, res) => { res.send('Hola Mundo!'); }); app.listen(3000, () => { console.log('Servidor escuchando en el puerto 3000'); });
Explicación:
app.use()
se utiliza para montar el middleware en la aplicación.- La función de middleware registra la hora actual y luego llama a
next()
para pasar el control a la siguiente función de middleware.
Middleware de Ruta
const express = require('express'); const app = express(); const logRequest = (req, res, next) => { console.log(`Solicitud a ${req.url}`); next(); }; // Middleware de ruta app.get('/user/:id', logRequest, (req, res) => { res.send(`Usuario ${req.params.id}`); }); app.listen(3000, () => { console.log('Servidor escuchando en el puerto 3000'); });
Explicación:
logRequest
es una función de middleware que se aplica solo a la ruta/user/:id
.- Registra la URL de la solicitud y luego llama a
next()
.
Middleware de Manejo de Errores
const express = require('express'); const app = express(); app.get('/', (req, res) => { throw new Error('Algo salió mal!'); }); // Middleware de manejo de errores app.use((err, req, res, next) => { console.error(err.stack); res.status(500).send('Algo salió mal!'); }); app.listen(3000, () => { console.log('Servidor escuchando en el puerto 3000'); });
Explicación:
- El middleware de manejo de errores tiene cuatro argumentos:
err
,req
,res
, ynext
. - Este middleware captura cualquier error que ocurra en la aplicación y envía una respuesta de error al cliente.
Ejercicio Práctico
Ejercicio 1: Middleware de Registro
Objetivo: Crear un middleware que registre el método HTTP y la URL de cada solicitud.
Instrucciones:
- Crea una nueva aplicación Express.
- Define un middleware que registre el método HTTP y la URL de cada solicitud.
- Aplica este middleware a toda la aplicación.
- Define una ruta GET
/
que responda con "Hola Mundo!".
Solución:
const express = require('express'); const app = express(); // Middleware de registro app.use((req, res, next) => { console.log(`Método: ${req.method}, URL: ${req.url}`); next(); }); app.get('/', (req, res) => { res.send('Hola Mundo!'); }); app.listen(3000, () => { console.log('Servidor escuchando en el puerto 3000'); });
Ejercicio 2: Middleware de Autenticación
Objetivo: Crear un middleware que verifique si una solicitud tiene un token de autenticación válido.
Instrucciones:
- Crea una nueva aplicación Express.
- Define un middleware que verifique si la solicitud tiene un token de autenticación en los encabezados.
- Si el token es válido, permite que la solicitud continúe; de lo contrario, responde con un error 401.
- Define una ruta GET
/protected
que responda con "Acceso concedido" si el token es válido.
Solución:
const express = require('express'); const app = express(); // Middleware de autenticación const authenticate = (req, res, next) => { const token = req.headers['authorization']; if (token === 'mi-token-secreto') { next(); } else { res.status(401).send('No autorizado'); } }; app.get('/protected', authenticate, (req, res) => { res.send('Acceso concedido'); }); app.listen(3000, () => { console.log('Servidor escuchando en el puerto 3000'); });
Conclusión
El middleware es una parte fundamental de Express.js que permite manejar el ciclo de vida de las solicitudes de manera flexible y modular. Comprender cómo crear y utilizar middleware te permitirá construir aplicaciones más robustas y mantenibles. En el siguiente tema, exploraremos cómo manejar el enrutamiento en Express.js para organizar mejor las rutas de tu aplicación.
Curso de Node.js
Módulo 1: Introducción a Node.js
Módulo 2: Conceptos Básicos
Módulo 3: Sistema de Archivos y E/S
Módulo 4: HTTP y Servidores Web
- Creando un Servidor HTTP Simple
- Manejo de Solicitudes y Respuestas
- Sirviendo Archivos Estáticos
- Enrutamiento
Módulo 5: NPM y Gestión de Paquetes
- Introducción a NPM
- Instalación y Uso de Paquetes
- Creación y Publicación de Paquetes
- Versionado Semántico
Módulo 6: Framework Express.js
- Introducción a Express.js
- Configuración de una Aplicación Express
- Middleware
- Enrutamiento en Express
- Manejo de Errores
Módulo 7: Bases de Datos y ORMs
- Introducción a las Bases de Datos
- Usando MongoDB con Mongoose
- Usando Bases de Datos SQL con Sequelize
- Operaciones CRUD
Módulo 8: Autenticación y Autorización
- Introducción a la Autenticación
- Usando Passport.js
- Autenticación JWT
- Control de Acceso Basado en Roles
Módulo 9: Pruebas y Depuración
- Introducción a las Pruebas
- Pruebas Unitarias con Mocha y Chai
- Pruebas de Integración
- Depuración de Aplicaciones Node.js
Módulo 10: Temas Avanzados
- Módulo Cluster
- Hilos de Trabajo
- Optimización del Rendimiento
- Construcción de APIs RESTful
- GraphQL con Node.js
Módulo 11: Despliegue y DevOps
- Variables de Entorno
- Usando PM2 para la Gestión de Procesos
- Desplegando en Heroku
- Integración y Despliegue Continuos