Implementación de Middleware en Node.js sin Express

Clase 6 de 26Curso de Node.js Avanzado

Resumen

Aprender cómo funciona el patrón Middleware en Node.js te permite ejecutar secuencialmente operaciones durante una solicitud. Aunque Express es conocido por utilizar extensivamente este patrón, es posible implementarlo desde cero en Node.js. Se trata fundamentalmente de funciones que manipulan solicitudes (requests) y respuestas (responses), pudiendo modificar, añadir o eliminar propiedades según su función.

¿Qué es el patrón Middleware?

El Middleware es una técnica sencilla pero poderosa, que permite gestionar solicitudes Web al dividir el procesamiento en etapas independientes. Es central en frameworks como Express y consiste en funciones que se ejecutan una tras otra en una cadena.

Un Middleware recibe tres argumentos principales:

  • Request (req): El objeto que contiene información sobre la petición realizada.
  • Response (res): El objeto que sirve para generar la respuesta a la petición.
  • Next: Una función que permite pasar al siguiente Middleware en la cadena.

Cada Middleware puede alterar o enriquecer los objetos recibidos antes de pasarlos al siguiente.

¿Cómo implementar Middleware sin Express?

Implementar tus Middlewares propios sin necesidad de Express es una manera efectiva de entender su funcionamiento interno. A continuación, se describe rápidamente cómo realizar una implementación básica utilizando sólo Node.js.

Paso a paso de la implementación:

  1. Crear función principal

Declara una función llamada runMiddlewares que acepte objetos tipo request, response y un arreglo de Middlewares.

  1. Definir Middlewares individuales

Cada Middleware es una función separada, claramente identificable:

const middleware1 = (req, res, next) => {
    console.log('Middleware 1 - Autenticación');
    next();
};

const middleware2 = (req, res, next) => {
    console.log('Middleware 2 - Procesamiento petición');
    next();
};

const middleware3 = (req, res, next) => {
    console.log('Middleware 3 - Finalización');
    next();
};
  1. Ejecutar los Middlewares secuencialmente

Cada Middleware se ejecuta en orden secuencial mediante una función recursiva:

const runMiddlewares = (req, res, middlewares) => {
    let index = 0;
    const next = () => {
        if (index < middlewares.length) {
            const middleware = middlewares[index++];
            middleware(req, res, next);
        }
    };
    next();
};
  1. Lanzar ejecución

Finalmente, debes iniciar este proceso indicando los parámetros requeridos:

const req = {};
const res = {};

runMiddlewares(req, res, [middleware1, middleware2, middleware3]);

¿Por qué es importante el orden de los Middlewares?

Los Middlewares se ejecutan estrictamente en el orden en que se han definido en su matriz. Esto permite controlar fácilmente funcionalidades específicas, como autenticación, validación, procesamiento principal y finalización. Así se garantiza que se cumpla el orden lógico requerido para cada tarea.

Ejemplo práctico de Middleware condicional

Como ejercicio adicional, puedes extender esta implementación con una lógica condicional. Por ejemplo, permitir al Middleware 3 controlar la ejecución del Middleware 4:

  • Middleware 3 verifica condiciones específicas.
  • Decide si ejecuta o no el Middleware 4 mediante una estructura condicional.

Este ejercicio aporta una capa adicional de utilidad real a tus conocimientos sobre Middlewares.

¡Intenta construir tu propia versión y compártela!