Route Handlers

This skill should be used when the user asks to "create an API route", "add an endpoint", "build a REST API", "handle POST requests", "create route ha

What Is Route Handlers?

Route Handlers are a core feature in Next.js's App Router, enabling developers to build custom API endpoints directly within their application's codebase. By defining functions that respond to HTTP requests in special route.ts (or route.js) files, Route Handlers provide a simple and scalable way to implement RESTful APIs, process form submissions, or handle advanced server-side logic without leaving the Next.js ecosystem. These handlers leverage the modern Web Request and Response APIs and are fully integrated into the Next.js app directory structure.

Why Use Route Handlers?

Route Handlers offer several compelling advantages for Next.js developers:

  • Native API Integration: They allow you to define backend logic and endpoints without spinning up a separate backend service, making full-stack development seamless within a single project.
  • Colocation: API routes are colocated with related application code, streamlining organization and maintenance.
  • Modern Standards: Built on the Fetch API, Route Handlers provide a familiar and standards-compliant approach to handling HTTP requests and responses.
  • Flexibility: They support all major HTTP methods, enabling CRUD operations and beyond.
  • Incremental Adoption: You can introduce API routes as needed, making it easy to expand your application's backend capabilities over time.

How to Get Started

Getting started with Route Handlers in Next.js is straightforward and requires only a few steps.

1. Create the Route

File

In your app directory, create a new folder structure under api/ that corresponds to your desired endpoint. Inside this folder, add a route.ts file:

app/
└── api/
    └── users/
        └── route.ts   # Handles requests to /api/users

2. Implement HTTP Method

Handlers

Export functions named after HTTP methods (e.g., GET, POST) from your route.ts file. Each function receives a Request object and returns a response:

// app/api/users/route.ts

import { NextResponse } from 'next/server'

export async function GET() {
  const users = await db.user.findMany()
  return NextResponse.json(users)
}

export async function POST(request: Request) {
  const body = await request.json()
  const user = await db.user.create({ data: body })
  return NextResponse.json(user, { status: 201 })
}

This example defines two endpoints:

  • GET /api/users: Returns a list of users.
  • POST /api/users: Creates a new user with data from the request body.

3. Access the

Endpoint

Once your route handler is defined, you can access it directly via HTTP requests to the corresponding API path, such as /api/users.

Key Features

Route Handlers in Next.js offer a rich set of features for API development:

Multiple HTTP Methods

You can export any combination of GET, POST, PUT, PATCH, DELETE, HEAD, and OPTIONS to handle different request types within the same file.

Request Body Parsing

Handlers can easily parse JSON bodies or form data from incoming requests:

export async function POST(request: Request) {
  const json = await request.json()     // Parse JSON payload
  const formData = await request.formData() // Parse form data
  // ... handle input
}

Dynamic API Routes

Support for dynamic API endpoints is built-in. By using bracket notation for folders, you can capture route parameters:

app/
└── api/
    └── posts/
        └── [id]/
            └── route.ts   # Handles /api/posts/:id

Inside the handler, extract route parameters from the params argument:

export async function GET(request: Request, { params }: { params: { id: string } }) {
  const post = await db.post.findUnique({ where: { id: params.id } })
  return NextResponse.json(post)
}

Streaming and Advanced Responses

Route Handlers support streaming responses, custom headers, and status codes using the NextResponse object.

return new NextResponse('Streamed content', { status: 200 })

Best Practices

To get the most out of Route Handlers, consider the following best practices:

  • Organize by Resource: Group related endpoints under meaningful subdirectories (/users, /posts), mirroring RESTful conventions.
  • Validate Input: Always validate and sanitize incoming data before processing to ensure security and data integrity.
  • Handle Errors Gracefully: Catch exceptions and return meaningful HTTP status codes and error messages.
  • Limit Surface Area: Only export the HTTP methods required by your application to minimize attack vectors.
  • Document Endpoints: Maintain clear documentation for each endpoint, including expected inputs, outputs, and status codes.

Important Notes

  • App Directory Required: Route Handlers work exclusively in the app directory as part of the App Router in Next.js. They are not available in the older pages directory approach.
  • Edge Runtime Compatibility: By default, handlers run on the Node.js runtime, but you can opt into the Edge runtime for improved cold starts and scalability.
  • Authentication: For secure endpoints, integrate authentication and authorization checks within each handler.
  • Middleware Integration: Route Handlers can be used in conjunction with Next.js middleware for cross-cutting concerns like logging or rate limiting.
  • Supported Methods: Only export supported HTTP methods; exporting unsupported ones will result in runtime errors.
  • No File Uploads Yet: Native file upload support may require additional setup or external libraries, as the platform evolves.

By leveraging Route Handlers, Next.js developers can efficiently build and scale robust APIs alongside their frontend code, benefiting from a unified development experience and modern web API standards.