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.
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 });
}
}