1. Understanding Middleware Functions
Middleware functions are a crucial concept in Node.js, especially when building web applications with frameworks like Express.js. They act as a bridge between the incoming request and the final response, allowing developers to process data, perform operations, and control the request-response cycle effectively.
2. What is Middleware?
Middleware refers to functions that have access to the request (req) and response (res) objects, as well as the next function. Middleware can:
3. Middleware Function Syntax
A middleware function typically has the following signature:
function middlewareFunction(req, res, next) {
// Perform some operation
console.log('Middleware is running');
// Call the next middleware or route handler
next();
}
req
: Represents the incoming request.res
: Represents the response to be sent back.next
: A function that passes control to the next middleware.
req
: Represents the incoming request.res
: Represents the response to be sent back.next
: A function that passes control to the next middleware.
4. Types of Middleware
Middleware can be categorized into different types based on its functionality:
1. Application-Level Middleware
Used across the entire application.
const express = require('express');
const app = express();
app.use((req, res, next) => {
console.log('Request URL:', req.url);
next();
});
app.get('/', (req, res) => {
res.send('Home Page');
});
app.listen(3000, () => {
console.log('Server running on http://localhost:3000');
});
2. Router-Level Middleware
Applied only to specific routes or groups of routes.
const express = require('express');
const router = express.Router();
router.use((req, res, next) => {
console.log('Middleware for specific routes');
next();
});
router.get('/user', (req, res) => {
res.send('User Page');
});
module.exports = router;
3. Error-Handling Middleware
Used to handle errors in the application.
app.use((err, req, res, next) => {
console.error('Error:', err.message);
res.status(500).send('Internal Server Error');
});
4. Built-in Middleware
Express provides built-in middleware for common tasks:
express.json()
: Parses incoming JSON requests.express.urlencoded()
: Parses URL-encoded data.
express.json()
: Parses incoming JSON requests.express.urlencoded()
: Parses URL-encoded data.
app.use(express.json());
app.use(express.urlencoded({ extended: true }));
5. Middleware Flow Example
Let’s look at how multiple middleware functions work together:
const express = require('express');
const app = express();
app.use((req, res, next) => {
console.log('Middleware 1');
next();
});
app.use((req, res, next) => {
console.log('Middleware 2');
next();
});
app.get('/', (req, res) => {
res.send('Hello from the main route!');
});
app.listen(3000, () => {
console.log('Server is running on http://localhost:3000');
});
Explanation:
- Each middleware logs a message and then calls
next()
. - The final response is sent from the route handler.
next()
.
6. Use Cases of Middleware
1. Logging and Debugging: Capture request details for debugging.
2. Authentication and Authorization: Validate users before allowing access.
3. Data Parsing: Parse JSON or form data.
4. Error Handling: Catch and manage errors gracefully.
5. Static File Serving: Serve static assets like images, CSS, and JS files.
7. Example: Authentication Middleware
function authenticateUser(req, res, next) {
const token = req.headers['authorization'];
if (token === 'valid-token') {
next();
} else {
res.status(401).send('Unauthorized');
}
}
app.use(authenticateUser);
app.get('/dashboard', (req, res) => {
res.send('Welcome to the dashboard!');
});