📖 Scenario: You are creating a simple Node.js server using Express. You want to add a custom middleware function that logs the request method and URL for every incoming request.
🎯 Goal: Build a custom middleware function in Express that logs the HTTP method and URL of each request, then use it in your server.
📋 What You'll Learn
Create an Express app
Write a middleware function named logger that logs the request method and URL
Use the logger middleware in the Express app
Add a simple route / that sends a response
💡 Why This Matters
🌍 Real World
Middleware is used in real web servers to add features like logging, authentication, and error handling without changing route code.
💼 Career
Understanding middleware is essential for backend developers working with Node.js and Express to build scalable and maintainable web applications.
Progress0 / 4 steps
1
Set up Express app
Create a variable called express that requires the 'express' module. Then create a variable called app by calling express().
Node.js
Hint
Use require('express') to import Express and call it to create the app.
2
Create logger middleware
Write a middleware function called logger that takes req, res, and next as parameters. Inside it, log the request method and URL using console.log, then call next().
Node.js
Hint
The middleware function must call next() to pass control to the next middleware.
3
Use logger middleware in app
Use the logger middleware in the Express app by calling app.use(logger).
Node.js
Hint
Use app.use() to add middleware to the Express app.
4
Add a simple route
Add a GET route for / using app.get that sends the text 'Hello World' as the response.
Node.js
Hint
Use app.get with a callback that calls res.send to send the response.
Practice
(1/5)
1. What is the main purpose of custom middleware in a Node.js Express app?
easy
A. To directly send HTML pages to the client
B. To add extra processing steps between receiving a request and sending a response
C. To replace the Express router completely
D. To store data permanently in a database
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 B
Quick Check:
Middleware = extra processing steps [OK]
Hint: Middleware adds steps between request and response [OK]
2. Which of the following is the correct syntax to define a simple middleware function in Express?
easy
A. app.use = function(req, res, next) { console.log('Hi'); next(); }
B. app.middleware(req, res, next) { console.log('Hi'); next(); }
C. app.use(req, res, next) => { console.log('Hi'); next(); }
D. app.use((req, res, next) => { console.log('Hi'); next(); });
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.
A. Calling next() after sending a response causes error
B. Missing call to next() inside the if block
C. Headers should be accessed as req.header, not req.headers
D. Middleware must always send a response
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 A
Quick Check:
Do not call next() after res.send [OK]
Hint: Don't call next() after sending response [OK]
Common Mistakes:
Calling next() after res.send causing double response
Assuming headers property name is wrong
Thinking middleware must always send response
5. You want to create middleware that logs request method and URL only for POST requests. Which code correctly implements this?
hard
A. app.use((req, res, next) => { if (req.method = 'POST') console.log(req.method, req.url); next(); });
B. app.use((req, res, next) => { if (req.method === 'post') console.log(req.method, req.url); next(); });
C. app.use((req, res, next) => { if (req.method === 'POST') console.log(req.method, req.url); next(); });
D. app.use((req, res, next) => { if (req.method === POST) console.log(req.method, req.url); next(); });
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 C
Quick Check:
Use strict equality and uppercase 'POST' [OK]
Hint: Use === 'POST' to check method string correctly [OK]
Common Mistakes:
Using single = instead of === for comparison
Using lowercase 'post' instead of uppercase
Using undefined POST variable without quotes
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.