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.