NextRequest and NextResponse

Extra Helpers

NextRequest and NextResponse (from next/server) extend the Web classes with conveniences: req.nextUrl, req.cookies, NextResponse.redirect, res.cookies.set.

// app/api/products/search/route.ts
import { NextRequest, NextResponse } from 'next/server';

export async function GET(req: NextRequest) {
  const q = req.nextUrl.searchParams.get('q')?.trim() ?? '';
  const page = Math.max(1, Number(req.nextUrl.searchParams.get('page') ?? 1));
  if (q.length < 2) {
    return NextResponse.json({ error: 'Query must be at least 2 characters' }, { status: 400 });
  }
  const results = await searchProducts(q, page);
  const res = NextResponse.json(results);
  res.headers.set('Cache-Control', 'public, s-maxage=60, stale-while-revalidate=300');
  res.cookies.set('lastSearch', q, { httpOnly: true, maxAge: 60 * 60 * 24 });
  return res;
}

Example

curl -i "localhost:3000/api/products/search?q=a"

Example output

HTTP/1.1 400 Bad Request
content-type: application/json

{"error":"Query must be at least 2 characters"}

Reading Headers and Cookies

import { cookies, headers } from 'next/headers';

export async function GET() {
  const auth = (await headers()).get('authorization');
  const cartId = (await cookies()).get('cartId')?.value;
  return Response.json({ hasAuth: Boolean(auth), cartId: cartId ?? null });
}