Express.js is a popular framework for developing web apps in Node.js. Middleware is a fundamental aspect that contributes to Express's power and flexibility. If you're familiar with the fundamentals of Express middleware, you'll recognize that it's similar to a set of steps your request takes. But what happens after the basics? Let's get started and examine sophisticated middleware topics in a basic manner.
Middleware be like: "I'm just a simple middleware, but when things get tough, I call my next()"
What is Middleware?
Middleware functions have access to the request object (req), the response object (res), and the following middleware function in the application's request-response cycle. These functions can execute a variety of activities, including altering the request or response objects, terminating the request-response cycle, and calling the next middleware in the stack.
Real-World Example: A Bakery
Imagine you own a bakery, and your shop is the server. Customers (requests) come in, and they have to go through several stages (middleware) to get their bread (response).
- Request logging: A staff member logs the customer’s details.
- Authorization: Another staff member checks if the customer has a valid membership card.
- Processing order: The baker prepares the bread.
- Packaging: Another staff member packs the bread.
- Sending response: Finally, the cashier hands over the packed bread to the customer.
1. Error Handling Middleware:
Sometimes things go wrong, and you need a way to catch and handle errors. Error-handling middleware functions have four arguments: err, req, res, and next.
app.use((err, req, res, next) => {
console.error(err.stack);
res.status(500).send('Something broke!');
});
2.Chaining Middleware:
You can create modular middleware functions and chain them together for reusability and cleaner code.
const checkAuth = (req, res, next) => {
if (req.user) {
next();
} else {
res.status(401).send('Unauthorized');
}
};
const logRequest = (req, res, next) => {
console.log(`${req.method} ${req.url}`);
next();
};
app.use(logRequest);
app.use(checkAuth);
3.Custom Middleware for Specific Tasks
Sometimes you need middleware to perform specific tasks like data validation, rate limiting, or even modifying the request object to include additional information.
const addTimestamp = (req, res, next) => {
req.requestTime = Date.now();
next();
};
app.use(addTimestamp);
Security Best Practices
1.Helmet Middleware:
When designing applications with Express.js, security is critical. Below are some lesser-known security guidelines and recommended practices that can help protect your application:
Helmet Middleware secures Express apps by setting multiple HTTP headers. It consists of a group of smaller middleware methods that set security-related HTTP headers.
const helmet = require('helmet');
app.use(helmet());
2.Rate Limiting:
Rate restriction prevents brute-force assaults by restricting the amount of requests a user can make in a given time period.
const rateLimit = require('express-rate-limit');
const limiter = rateLimit({
windowMs: 15 * 60 * 1000, // 15 minutes
max: 100, // limit each IP to 100 requests per windowMs
});
app.use(limiter);
3.Content Security Policy (CSP):
CSP helps prevent cross-site scripting (XSS) attacks by specifying which content sources are trusted.
app.use(helmet.contentSecurityPolicy({
directives: {
defaultSrc: ["'self'"],
scriptSrc: ["'self'", "trusted.com"]
}
}));
Just like you would take every precaution to keep your bakery safe and running properly, these techniques will help keep your web application secure and dependable.
Thank you for the Read!
Top comments (0)