Los middlewares son funciones que se ejecutan como intermediarios entre el envio de la petición por el cliente y el manejo del servidor. En el medio los middlewares pueden ejecutar algun comando o transformar la información que llega del cliente. Como la mayoria de las funciones de Nest, se crean desde la terminal de comandos

nest generate middleware rutaDondeCrearaElMiddleware

Una vez que lo ejecutamos nos dará como resultado esto

import { Injectable, NestMiddleware } from '@nestjs/common';
import { Request, Response } from 'express';

@Injectable()
export class CustomMiddleware implements NestMiddleware {
  use(req: Request, res: Response, next: () => void) {
  //Código a ejecutar
    next();
  }
}

Como ves, tiene una response y un request como para empezar a trabajar con respuestas y peticiones. Y el next que se pasa como parametro y luego se ejecuta dentro de la función está para que luego de la ejecucion del middleware la petición siga camino hacia el servidor como lo haría habitualmente.

Para poder ejecutarlo, no lo tengo que llamar en el controlador sino directamente en el módulo en el que hayamos creado el middleware.

@Module({
  controllers: [TasksController],
  providers: [TasksService],
})
export class TasksModule implements NestModule {
  configure(consumer: MiddlewareConsumer) {
    consumer.apply(CustomMiddleware).forRoutes('/customRoute');
  }
}

La forma de hacerlo es un poco larga pero lo vamos a explicar paso a paso.

  1. Primero implementamos las propiedades de la clase NestModule en nuestro módulo. Eso incluye una función para configurar el consumo de middlewares llamada configure.
  2. A configure le pasamos como consumer el MiddlewareConsumer para darle a entender que estamos por consumir un middleware
  3. Consumer tiene una propiedad que se llama apply a la que le debemos indicar que middleware tiene que aplicar. Ahi le pasamos el nombre del middleware que creamos
  4. Por ultimo, debemos definir en que rutas lo haremos funcionar. Se la pasamos como parametro al metodo forRoutes

En forRoutes también puedo mencionar varias rutas e inclusive metodos en los cuales se aplicará el middleware

export class TasksModule implements NestModule {
  configure(consumer: MiddlewareConsumer) {
    consumer
      .apply(CustomMiddleware)
      .forRoutes({ path: '/customRoute', method: RequestMethod.GET });
  }
}