SkillByAIOpen interactive version →

Lesson 9 / 34

Middleware

Run logic before route handlers with middleware classes and apply them to chosen routes in a module's configure method.

Write middleware

Middleware is a function or class that runs before/after a route handler.

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(`${req.method} ${req.path}`);
    next();
  }
}

Apply middleware

Apply in configure() method of a module, specifying routes to intercept.

export class AppModule implements NestModule {
  configure(consumer: MiddlewareConsumer) {
    consumer
      .apply(LoggerMiddleware)
      .forRoutes('users'); // or use { path: 'users', method: RequestMethod.GET }
  }
}

Functional middleware

A middleware is a plain function of (req, res, next).

  • Call next() or the request hangs.
  • consumer.apply(...).forRoutes('users') attaches it to one route prefix.
import { Module, NestModule, MiddlewareConsumer } from '@nestjs/common';
import { Request, Response, NextFunction } from 'express';

function logger(req: Request, _res: Response, next: NextFunction) {
  console.log(`${req.method} ${req.url}`);
  next();
}

@Module({})
export class AppModule implements NestModule {
  configure(consumer: MiddlewareConsumer) {
    consumer.apply(logger).forRoutes('users');
  }
}

Quick check

Quick check: In the request lifecycle, which runs first?

  • Guards
  • Pipes
  • Middleware
Answer

Middleware — Order is middleware, guards, interceptors (before), pipes, handler.