What if you could add powerful features to your server with just one simple function?
Why Building custom middleware in Node.js? - Purpose & Use Cases
Imagine you have a Node.js server handling requests, and you want to add logging, authentication, and error handling manually for every route.
You write the same code again and again inside each route handler.
Manually adding repeated code for each route is tiring and easy to forget.
It makes your code messy, hard to update, and bugs can sneak in if you miss a step.
Custom middleware lets you write reusable functions that run before your routes.
This keeps your code clean, organized, and easy to maintain.
app.get('/data', (req, res) => { console.log('Request received'); if (!req.user) return res.status(401).send('Unauthorized'); // route logic });
app.use(loggingMiddleware);
app.use(authMiddleware);
app.get('/data', (req, res) => {
// route logic
});It enables you to add common features once and have them work everywhere automatically.
Think of a security guard checking IDs at the entrance of every room instead of having each room check IDs separately.
Manual repetition causes messy and error-prone code.
Custom middleware centralizes common tasks.
This leads to cleaner, easier-to-maintain servers.
Practice
Solution
Step 1: Understand middleware role
Middleware functions run between receiving a request and sending a response, allowing extra processing.Step 2: Identify correct purpose
Custom middleware adds steps like logging, authentication, or modifying requests before response.Final Answer:
To add extra processing steps between receiving a request and sending a response -> Option BQuick Check:
Middleware = extra processing steps [OK]
- Thinking middleware sends responses directly always
- Confusing middleware with routing
- Assuming middleware stores data permanently
Solution
Step 1: Recall Express middleware syntax
Middleware is added using app.use() with a function taking (req, res, next).Step 2: Check each option
app.use((req, res, next) => { console.log('Hi'); next(); }); correctly uses app.use with an arrow function and calls next(). Others have syntax errors.Final Answer:
app.use((req, res, next) => { console.log('Hi'); next(); }); -> Option DQuick Check:
app.use + (req, res, next) function = correct [OK]
- Missing parentheses around parameters
- Assigning app.use instead of calling it
- Using arrow function without parentheses for multiple params
app.use((req, res, next) => {
req.customValue = 42;
next();
});
app.get('/', (req, res) => {
res.send(`Value is ${req.customValue}`);
});What will be the response when a client requests '/'?
Solution
Step 1: Understand middleware effect on req object
The middleware adds a property customValue with 42 to the req object and calls next() to continue.Step 2: Check route handler usage
The route handler reads req.customValue and sends it in the response string.Final Answer:
Value is 42 -> Option AQuick Check:
Middleware sets req.customValue = 42 [OK]
- Assuming req.customValue is lost after middleware
- Thinking next() stops execution
- Expecting error without setting property
app.use((req, res, next) => {
if (!req.headers['x-auth']) {
res.status(401).send('Unauthorized');
}
next();
});Solution
Step 1: Analyze middleware flow
If 'x-auth' header is missing, response is sent with 401 status, ending the request.Step 2: Check next() call after response
Calling next() after sending a response causes Express to continue processing, leading to errors.Final Answer:
Calling next() after sending a response causes error -> Option AQuick Check:
Do not call next() after res.send [OK]
- Calling next() after res.send causing double response
- Assuming headers property name is wrong
- Thinking middleware must always send response
Solution
Step 1: Check condition for POST method
Correct comparison uses '===' and string 'POST' in uppercase.Step 2: Verify logging and next call
app.use((req, res, next) => { if (req.method === 'POST') console.log(req.method, req.url); next(); }); logs method and URL only if method is POST, then calls next() to continue.Final Answer:
app.use((req, res, next) => { if (req.method === 'POST') console.log(req.method, req.url); next(); }); -> Option CQuick Check:
Use strict equality and uppercase 'POST' [OK]
- Using single = instead of === for comparison
- Using lowercase 'post' instead of uppercase
- Using undefined POST variable without quotes
Ready to prove it?
Pass the test and this pattern moves unknown
