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

  1. Funciones de Middleware: Son funciones que se ejecutan durante el ciclo de vida de una solicitud en una aplicación Express.
  2. Pila de Middleware: Las funciones de middleware se ejecutan en el orden en que se definen en la aplicación.
  3. next(): Es una función que se llama para pasar el control a la siguiente función de middleware.

Tipos de Middleware

  1. Middleware de Aplicación: Se aplica a toda la aplicación.
  2. Middleware de Ruta: Se aplica a rutas específicas.
  3. Middleware de Manejo de Errores: Se utiliza para manejar errores en la aplicación.
  4. Middleware Incorporado: Express tiene algunos middleware incorporados como express.json() y express.urlencoded().
  5. 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, y next.
  • 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:

  1. Crea una nueva aplicación Express.
  2. Define un middleware que registre el método HTTP y la URL de cada solicitud.
  3. Aplica este middleware a toda la aplicación.
  4. 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:

  1. Crea una nueva aplicación Express.
  2. Define un middleware que verifique si la solicitud tiene un token de autenticación en los encabezados.
  3. Si el token es válido, permite que la solicitud continúe; de lo contrario, responde con un error 401.
  4. 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

Módulo 5: NPM y Gestión de Paquetes

Módulo 6: Framework Express.js

Módulo 7: Bases de Datos y ORMs

Módulo 8: Autenticación y Autorización

Módulo 9: Pruebas y Depuración

Módulo 10: Temas Avanzados

Módulo 11: Despliegue y DevOps

Módulo 12: Proyectos del Mundo Real

© Copyright 2024. Todos los derechos reservados