advanced
Middleware
Run edge request logic for redirects, rewrites, auth checks, headers, and lightweight routing decisions.
Middleware runs on the Edge before a route handler or page renders. Use it for redirects, rewrites, lightweight auth gates, locale negotiation, and header injection — not for heavy database work or long CPU tasks.
// middleware.ts
export function middleware(request: NextRequest) {
if (!request.cookies.get('session')) {
return NextResponse.redirect(new URL('/login', request.url));
}
}
export const config = { matcher: ['/dashboard/:path*'] };
Matcher config limits which paths pay middleware cost. Edge runtime constraints differ from Node route handlers.
On interviews: contrast middleware with route handlers and layout-level auth checks.
Common pitfalls: full session validation with remote DB on every asset request, unbounded matchers, and treating middleware as a BFF.
The trade-off is early request control versus limited runtime and cold-start behavior on edge.
Checklist:
- Keep middleware fast and matcher-scoped.
- Redirect/rewrite before expensive work.
- Put heavy logic in route handlers or server actions.
- Test cookie and header contracts explicitly.