Qué es un Middleware en Nest
Un middleware en NestJS es una función que se ejecuta durante el ciclo de vida de una petición HTTP, específicamente entre la recepción de la solicitud y la respuesta final. Estos componentes actúan como interceptores que pueden modificar, validar o procesar tanto las peticiones entrantes como las respuestas salientes.
Los middlewares en NestJS siguen el mismo patrón que Express.js, ya que NestJS está construido sobre este framework. Esto significa que tienen acceso completo a los objetos request
y response
, así como a la función next()
que permite continuar con el siguiente middleware en la cadena.
Características fundamentales
Los middlewares en NestJS pueden realizar múltiples operaciones críticas:
- Ejecutar código personalizado antes de que la petición llegue al controlador
- Modificar los objetos
request
yresponse
- Terminar el ciclo de petición-respuesta prematuramente
- Llamar al siguiente middleware en la pila mediante
next()
- Validar permisos o autenticación antes del procesamiento
- Registrar información sobre las peticiones para auditoría
Tipos de middleware disponibles
NestJS ofrece diferentes enfoques para implementar middlewares:
1 - Middleware funcional:
import { Request, Response, NextFunction } from 'express';
export function logger(req: Request, res: Response, next: NextFunction) {
console.log(`${req.method} ${req.url} - ${new Date().toISOString()}`);
next();
}
2 - Middleware basado en clases:
import { Injectable, NestMiddleware } from '@nestjs/common';
import { Request, Response, NextFunction } from 'express';
@Injectable()
export class LoggerMiddleware implements NestMiddleware {
use(req: Request, res: Response, next: NextFunction) {
console.log(`Petición recibida: ${req.method} ${req.originalUrl}`);
next();
}
}
Flujo de ejecución
El orden de ejecución en NestJS sigue una secuencia específica que es importante comprender:
- Middlewares globales (aplicados a toda la aplicación)
- Middlewares de módulo (configurados en módulos específicos)
- Guards (protección de rutas)
- Interceptors (antes del controlador)
- Pipes (transformación y validación)
- Controlador (manejo de la petición)
- Interceptors (después del controlador)
- Filtros de excepción (si ocurre un error)
Casos de uso comunes
Los middlewares son especialmente útiles para implementar funcionalidades transversales:
- Logging y auditoría: Registrar todas las peticiones HTTP con detalles como IP, timestamp y duración
- Autenticación básica: Verificar tokens o credenciales antes de procesar la petición
- Validación de headers: Comprobar que las peticiones incluyan headers obligatorios
- Rate limiting: Controlar la frecuencia de peticiones por usuario o IP
- Transformación de datos: Modificar el formato de los datos antes de llegar al controlador
Configuración en módulos
Para aplicar un middleware en NestJS, debes configurarlo en el módulo correspondiente implementando la interfaz NestModule
:
import { Module, NestModule, MiddlewareConsumer } from '@nestjs/common';
import { LoggerMiddleware } from './logger.middleware';
import { UsersController } from './users.controller';
@Module({
controllers: [UsersController],
})
export class UsersModule implements NestModule {
configure(consumer: MiddlewareConsumer) {
consumer
.apply(LoggerMiddleware)
.forRoutes('users');
}
}
Esta configuración permite un control granular sobre qué rutas y métodos HTTP serán afectados por cada middleware, proporcionando flexibilidad en la arquitectura de tu aplicación.
Fuentes y referencias
Documentación oficial y recursos externos para profundizar en Nest
Documentación oficial de Nest
Alan Sastre
Ingeniero de Software y formador, CEO en CertiDevs
Ingeniero de software especializado en Full Stack y en Inteligencia Artificial. Como CEO de CertiDevs, Nest es una de sus áreas de expertise. Con más de 15 años programando, 6K seguidores en LinkedIn y experiencia como formador, Alan se dedica a crear contenido educativo de calidad para desarrolladores de todos los niveles.
Más tutoriales de Nest
Explora más contenido relacionado con Nest y continúa aprendiendo con nuestros tutoriales gratuitos.
Aprendizajes de esta lección
- Comprender qué es un middleware y su función en el ciclo de vida de una petición HTTP en NestJS.
- Diferenciar entre middlewares funcionales y basados en clases.
- Conocer el flujo de ejecución de middlewares y otros componentes en NestJS.
- Aprender a configurar middlewares en módulos específicos para controlar rutas y métodos.
- Identificar casos de uso comunes para middlewares como autenticación, logging y validación.