How do you handle middleware in Next.js?
Assesses fundamental understanding of Next.js conventions, runtime behavior, and memory/performance considerations.
Hiring managers look for precision, avoidance of ambiguous jargon, and ability to explain trade-offs under real production conditions.
Middleware in Next.js enables you to run code on incoming requests before they are completed, ideal for authentication, bot detection, A/B testing, and URL rewrites:
### Creating Middleware:
Create a single middleware.ts (or .js) file at the root of your project (or inside src/):
// middleware.ts
import { NextResponse } from 'next/server';
import type { NextRequest } from 'next/request';
export function middleware(request: NextRequest) {
const token = request.cookies.get('auth_token')?.value;
// Protect admin dashboard routes
if (request.nextUrl.pathname.startsWith('/admin') && !token) {
return NextResponse.redirect(new URL('/login', request.url));
}
return NextResponse.next();
}
// Matcher config: run only on specific routes
export const config = {
matcher: ['/admin/:path*', '/dashboard/:path*'],
};
### Key Capabilities:
- Operates on the lightweight Next.js Edge Runtime.
- Can modify request headers, response headers, or set cookies.
- Can rewrite URLs (
NextResponse.rewrite()) or redirect users (NextResponse.redirect()).
Candidate Response Strategy & Interview Tips
- Start with a concise one-sentence summary: Deliver a direct, confident answer first before expanding into nuances.
- Demonstrate real-world trade-offs: Discuss where this approach excels and when you would avoid it in production systems.
- Discuss complexity & edge cases: Proactively explain time/space complexity or boundary conditions (null values, scale limits).
- Prepare for interviewer follow-ups: Technical hiring panels frequently probe deeper into concurrency, backward compatibility, or alternative libraries.