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.