📖 Scenario: You are building a simple NestJS server that logs requests. Middleware helps you run code before your route handlers. Functional middleware is a simple function that can log info about each request.
🎯 Goal: Create a functional middleware in NestJS that logs the HTTP method and URL of each incoming request.
📋 What You'll Learn
Create a functional middleware function named loggerMiddleware
Use the req, res, and next parameters in the middleware
Log the HTTP method and URL using console.log
Call next() to pass control to the next middleware or route handler
Apply the middleware to a simple NestJS AppModule using configure method
💡 Why This Matters
🌍 Real World
Middleware is used in real web servers to handle tasks like logging, authentication, and error handling before requests reach the main logic.
💼 Career
Understanding functional middleware is essential for backend developers working with NestJS or similar frameworks to build scalable and maintainable server applications.
Progress0 / 4 steps
1
Create the functional middleware
Create a function called loggerMiddleware that takes req, res, and next as parameters.
NestJS
Hint
Middleware functions always have three parameters: req, res, and next.
2
Add logging inside the middleware
Inside the loggerMiddleware function, add a console.log statement that logs the HTTP method and URL from req.method and req.url. Then call next().
NestJS
Hint
Use template strings to combine req.method and req.url in the log.
3
Apply middleware in AppModule
In the AppModule class, implement the configure method. Use consumer.apply(loggerMiddleware).forRoutes('*') to apply the middleware to all routes.
NestJS
Hint
The configure method receives a consumer to apply middleware.
4
Complete the NestJS server setup
Add the necessary imports for NestFactory from @nestjs/core. Create an async bootstrap function that creates the app with NestFactory.create(AppModule) and listens on port 3000. Call bootstrap().
NestJS
Hint
Use await with NestFactory.create and app.listen inside an async function.
Practice
(1/5)
1. What is the main purpose of functional middleware in NestJS?
easy
A. To run code before the route handler to modify requests or add features
B. To define database models for the application
C. To create UI components for the frontend
D. To compile TypeScript code into JavaScript
Solution
Step 1: Understand middleware role
Middleware runs before route handlers to process requests or add features like logging or authentication.
Step 2: Identify correct purpose
Options A, B, and D relate to other parts of development, not middleware.
Final Answer:
To run code before the route handler to modify requests or add features -> Option A
Quick Check:
Middleware runs before routes = C [OK]
Hint: Middleware runs before routes to add features [OK]
Common Mistakes:
Confusing middleware with database models
Thinking middleware creates UI components
Believing middleware compiles code
2. Which of the following is the correct way to define a functional middleware in NestJS?
easy
A. function logger(req, res) { console.log(req.url); }
B. class Logger { log(req, res) { console.log(req.url); } }
C. const logger = () => { console.log('log'); }
D. function logger(req, res, next) { console.log(req.url); next(); }
Solution
Step 1: Check middleware signature
Functional middleware must accept (req, res, next) and call next() to continue.
Step 2: Validate options
function logger(req, res, next) { console.log(req.url); next(); } matches this pattern. class Logger { log(req, res) { console.log(req.url); } } is a class, not functional middleware. const logger = () => { console.log('log'); } lacks parameters and next call. function logger(req, res) { console.log(req.url); } misses next parameter and call.
Final Answer:
function logger(req, res, next) { console.log(req.url); next(); } -> Option D
Quick Check:
Middleware needs (req, res, next) and calls next() [OK]
Hint: Middleware needs (req, res, next) and calls next() [OK]
Common Mistakes:
Omitting the next parameter
Not calling next() inside middleware
Using class instead of function for functional middleware
3. Given this middleware code, what will be logged when a request to '/home' is made?
function logger(req, res, next) {
console.log('Request URL:', req.url);
next();
}
medium
A. Request URL: undefined
B. Request URL: /home
C. No output because next() stops logging
D. Error: req.url is not defined
Solution
Step 1: Understand req.url property
In middleware, req.url contains the path of the incoming request, here '/home'.
Step 2: Analyze console.log output
The middleware logs 'Request URL:' followed by req.url, so it prints 'Request URL: /home'.
Final Answer:
Request URL: /home -> Option B
Quick Check:
req.url logs request path = A [OK]
Hint: req.url holds the request path string [OK]
Common Mistakes:
Assuming next() stops console.log
Thinking req.url is undefined
Confusing middleware with route handler output
4. Identify the error in this functional middleware code:
function auth(req, res, next) {
if (!req.headers.authorization) {
res.status(401).send('Unauthorized');
}
next();
}
medium
A. res.status should be res.sendStatus
B. Missing req parameter in function signature
C. next() is called even after sending response, causing errors
D. Authorization header check is incorrect
Solution
Step 1: Analyze flow after sending response
If authorization header is missing, response is sent with 401, but next() is still called, which can cause errors by continuing the request cycle.
Step 2: Identify correct fix
To fix, add return before res.status(401).send(...) to stop execution or call next() only if authorized.
Final Answer:
next() is called even after sending response, causing errors -> Option C
Quick Check:
Call next() only if no response sent [OK]
Hint: Don't call next() after sending response [OK]
Common Mistakes:
Calling next() after res.send causes errors
Forgetting to stop middleware after response
Misusing res.status vs res.sendStatus
5. You want to create a functional middleware that adds a custom header 'X-App-Version' with value '1.0' to every response. Which code correctly implements this?
hard
A. function addVersion(req, res, next) { res.setHeader('X-App-Version', '1.0'); next(); }
B. function addVersion(req, res) { res.setHeader('X-App-Version', '1.0'); }
C. function addVersion(req, res, next) { next(); res.setHeader('X-App-Version', '1.0'); }
D. function addVersion(req, res, next) { req.setHeader('X-App-Version', '1.0'); next(); }
Solution
Step 1: Confirm middleware signature and header setting
Middleware must accept (req, res, next) and call next() after setting headers. res.setHeader is correct method.
Step 2: Evaluate options
function addVersion(req, res, next) { res.setHeader('X-App-Version', '1.0'); next(); } sets header then calls next() correctly. function addVersion(req, res) { res.setHeader('X-App-Version', '1.0'); } misses next parameter and call. function addVersion(req, res, next) { next(); res.setHeader('X-App-Version', '1.0'); } calls next() before setting header, so header may not be sent. function addVersion(req, res, next) { req.setHeader('X-App-Version', '1.0'); next(); } uses req.setHeader which is incorrect because req cannot set response headers.
Final Answer:
function addVersion(req, res, next) { res.setHeader('X-App-Version', '1.0'); next(); } -> Option A
Quick Check:
Set header before next() with correct method [OK]
Hint: Set header before next() using res.setHeader [OK]
Common Mistakes:
Calling next() before setting headers
Omitting next parameter or call
Confusing req and res when setting headers
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.