Using Middleware in Next.js
Introduction
Middleware in Next.js allows you to run custom code before a request is completed. This is useful for tasks such as authentication, logging, and more.
What is Middleware?
Middleware functions are functions that have access to the request object (req), the response object (res), and the next middleware function in the application's request-response cycle.
Note: Middleware can be added globally or to specific routes.
How to Use Middleware
- Create a middleware file in your Next.js project.
- Define your middleware function.
- Apply the middleware to your routes.
1. Create a Middleware File
Create a new file named middleware.js
in the root of your Next.js project.
2. Define Your Middleware Function
export function middleware(req, res, next) {
// Custom middleware logic
console.log('Middleware executed');
next(); // Proceed to the next middleware or route handler
}
3. Apply the Middleware to Your Routes
import { middleware } from './middleware';
export default function handler(req, res) {
middleware(req, res, () => {
// Route handler logic
res.status(200).json({ message: 'Hello from the route!' });
});
}
Code Example
Here is a complete example of using middleware in a Next.js API route:
// middleware.js
export function middleware(req, res, next) {
if (!req.headers.authorization) {
res.status(401).json({ message: 'Unauthorized' });
return;
}
next();
}
// pages/api/secure.js
import { middleware } from '../../middleware';
export default function handler(req, res) {
middleware(req, res, () => {
res.status(200).json({ message: 'Access granted!' });
});
}
Best Practices
- Keep middleware functions small and focused.
- Use middleware for cross-cutting concerns.
- Document your middleware functions for clarity.
FAQ
What are some common use cases for middleware?
Common use cases include authentication, logging, and request validation.
Can I use multiple middleware functions?
Yes, you can chain multiple middleware functions together.
How does middleware affect performance?
Middleware can introduce latency, so it should be optimized for performance.