Middleware in Next.js
Middlewares are code that runs before / after your request handler.
Commonly used for
- Analytics
- Authentication
- Redirecting [ In an Express App it is not applicables, cuz Express runs in backend ]
- Modifying the request/response
How
Create an middleware.ts
, in the top level of yourfresh Next.js app.
You can only one have one middleware.ts
where all your middlewares are defined. But you can still organize your middleware logic modularly & then importing them in middleware.ts
file.
A Simple Middleware to count the number of Visitors on your site -
// This code will run on every request
import { NextRequest, NextResponse } from "next/server";
let requestCount = 0;
// Simply Define a function named middleware that takes req as parameter.
export default function middleware(req: NextRequest) {
requestCount++;
console.log("Number of Requests", requestCount);
return NextResponse.next();
}
But there is a problem.
Every time we visit the app the count get increased by many times, not 1. This is because Next.js
made many request which will cause counter to increase many times.
)
There are 2 ways to avoid this
- Using Custom Matchers
Matcher allows you to filter Middleware to run on specific paths.
export const config = {
matcher: ["/api/:path*", "/"],
// matcher: "/api/:path*",
};
- Using Conditional Rendering
export default function middleware(req: NextRequest) {
//if (req.nextUrl.pathname === "/") {
// requestCount++;
// console.log("Number of Requests", requestCount);
// return NextResponse.next();
//}
if (
req.nextUrl.pathname.startsWith("/") ||
req.nextUrl.pathname.startsWith("/services")
) {
requestCount++;
console.log("Number of Requests", requestCount);
return NextResponse.next();
} else if (req.nextUrl.pathname.startsWith("/admin")) {
if (req.body.name !== "Jayant") {
return NextResponse.redirect(new URL("/", req.url));
} else {
return NextResponse.next();
}
} else {
NextResponse.next();
}
}
Ref : Next JS Middleware