Applying Middleware

MiddlewareConsumer

Middleware is not listed in @Module(). The module implements NestModule and wires it in configure().

src/app.module.ts

import { MiddlewareConsumer, Module, NestModule, RequestMethod } from '@nestjs/common';
import { ProductsModule } from './products/products.module';
import { ProductsController } from './products/products.controller';
import { RequestIdMiddleware } from './common/middleware/request-id.middleware';
import { LoggerMiddleware } from './common/middleware/logger.middleware';
import { blockBots } from './common/middleware/block-bots.middleware';

@Module({ imports: [ProductsModule] })
export class AppModule implements NestModule {
  configure(consumer: MiddlewareConsumer) {
    consumer
      .apply(RequestIdMiddleware, LoggerMiddleware)    // run in this order
      .exclude({ path: 'health', method: RequestMethod.GET })
      .forRoutes('{*splat}');                          // all routes (NestJS 11 / Express 5 syntax)

    consumer.apply(blockBots).forRoutes(ProductsController);   // only this controller
    consumer.apply(blockBots).forRoutes({ path: 'orders', method: RequestMethod.POST });
  }
}

Note: NestJS 11 uses Express 5, whose path syntax changed: a bare * wildcard is written {*splat} (or *splat). In NestJS 10 you wrote forRoutes('*'); NestJS 11 still converts it but logs a warning.