Global middleware runs for every request in your app. It helps you add common features like logging or security checks everywhere without repeating code.
Global middleware in NestJS
import { Injectable, NestMiddleware, MiddlewareConsumer, Module, NestModule } from '@nestjs/common'; import { Request, Response, NextFunction } from 'express'; @Injectable() export class LoggerMiddleware implements NestMiddleware { use(req: Request, res: Response, next: NextFunction) { console.log(`Request... Method: ${req.method}, URL: ${req.url}`); next(); } } @Module({}) export class AppModule implements NestModule { configure(consumer: MiddlewareConsumer) { consumer.apply(LoggerMiddleware).forRoutes('*'); } }
The forRoutes('*') means the middleware runs on all routes.
Middleware must call next() to continue the request cycle.
consumer.apply(LoggerMiddleware).forRoutes('*');/users route.consumer.apply(AuthMiddleware).forRoutes('users');consumer.apply(LoggerMiddleware, AuthMiddleware).forRoutes('*');This example shows how to create a simple logger middleware that prints the HTTP method and URL for every request. It is applied globally to all routes using forRoutes('*').
import { Injectable, NestMiddleware, MiddlewareConsumer, Module, NestModule } from '@nestjs/common'; import { Request, Response, NextFunction } from 'express'; @Injectable() export class LoggerMiddleware implements NestMiddleware { use(req: Request, res: Response, next: NextFunction) { console.log(`Request... Method: ${req.method}, URL: ${req.url}`); next(); } } @Module({}) export class AppModule implements NestModule { configure(consumer: MiddlewareConsumer) { consumer.apply(LoggerMiddleware).forRoutes('*'); } } // When you run the NestJS app and make any HTTP request, the console will show the request method and URL.
Global middleware runs before route handlers and can modify requests or responses.
Always call next() in middleware to avoid blocking requests.
You can apply multiple middleware globally by listing them in apply().
Global middleware runs on every request in the app.
Use consumer.apply(...).forRoutes('*') to apply middleware globally.
Middleware helps add common features like logging or security checks easily.
Practice
Solution
Step 1: Understand middleware role
Middleware runs before route handlers to process requests or add features like logging.Step 2: Identify global middleware scope
Global middleware runs on every request, so it applies common logic everywhere.Final Answer:
To run code on every incoming request before reaching route handlers -> Option BQuick Check:
Global middleware = runs on every request [OK]
- Confusing middleware with route handlers
- Thinking middleware only runs on some routes
- Mixing middleware with error handling
Solution
Step 1: Recall global middleware syntax
In NestJS, the recommended way to apply middleware globally is using app.useGlobalMiddleware(MyMiddleware).Step 2: Compare options
consumer.apply(MyMiddleware).forRoutes('*') applies middleware to all routes but is not truly global middleware; app.useGlobalMiddleware applies middleware globally.Final Answer:
app.useGlobalMiddleware(MyMiddleware) -> Option AQuick Check:
Global middleware uses app.useGlobalMiddleware [OK]
- Using consumer.apply(...).forRoutes('*') for global middleware
- Trying to call non-existent app methods
- Confusing middleware registration with guards
export class LoggerMiddleware implements NestMiddleware {
use(req: Request, res: Response, next: Function) {
console.log(`Request to: ${req.url}`);
next();
}
}
// Applied globally with consumer.apply(LoggerMiddleware).forRoutes('*')Solution
Step 1: Analyze middleware code
The middleware logs the string 'Request to:' plus the request URL from req.url.Step 2: Understand global application
Since applied globally, this log happens on every request URL received by the app.Final Answer:
Logs the URL of every incoming request -> Option DQuick Check:
LoggerMiddleware logs req.url every request [OK]
- Assuming HTTP method is logged instead of URL
- Forgetting next() causes no further processing
- Thinking response status is logged
export class AuthMiddleware implements NestMiddleware {
use(req: Request, res: Response) {
if (!req.headers.authorization) {
res.status(401).send('Unauthorized');
}
}
}
// Applied with consumer.apply(AuthMiddleware).forRoutes('*')Solution
Step 1: Check middleware method signature
The use method lacks the next parameter and does not call next(), so request stops here.Step 2: Understand middleware flow
Without calling next(), the request will hang or not proceed to route handlers after middleware.Final Answer:
Missing call to next() to continue request processing -> Option AQuick Check:
Middleware must call next() to proceed [OK]
- Omitting next() call in middleware
- Misunderstanding middleware flow control
- Thinking forRoutes('*') is invalid
Solution
Step 1: Understand route filtering in middleware
NestJS allows filtering middleware by path and HTTP method using forRoutes with an object.Step 2: Apply middleware globally but only for POST
Using forRoutes({ path: '*', method: RequestMethod.POST }) applies middleware to all paths but only POST requests.Step 3: Evaluate other options
Use consumer.apply(LoggerMiddleware).forRoutes('*') and check req.method inside middleware applies middleware on all methods, not just POST. Apply middleware only on POST routes manually, no global option is manual, not global. Use app.useGlobalMiddleware(LoggerMiddleware) with method filter is invalid syntax.Final Answer:
Use consumer.apply(LoggerMiddleware).forRoutes({ path: '*', method: RequestMethod.POST }) -> Option CQuick Check:
forRoutes with method filter = selective global middleware [OK]
- Applying middleware globally without method filter
- Trying non-existent app.useGlobalMiddleware method
- Manually applying middleware on each POST route
Ready to prove it?
Pass the test and this pattern moves unknown
