Next.js API Routes Example: Mastering Backend in Next.js

Next.js API Routes Example: Mastering Backend in Next.js

Modern web applications often require backend functionality to handle data, authentication, or communication with external APIs. Traditionally, developers needed a separate server for backend operations, but with Next.js API routes, you can build full-stack applications using a single framework. next.js api routes example.

In this guide, we’ll explore Next.js API routes, provide practical examples, and demonstrate how to handle requests, responses, and dynamic routes. Whether you’re a web developer, mobile app developer, or software engineer, this blog will equip you with the knowledge to build robust, production-ready backend functionality in your Next.js apps.


What Are Next.js API Routes?

Next.js API routes allow you to create serverless functions directly in your project. These functions can handle HTTP requests (GET, POST, PUT, DELETE) and act as backend endpoints without requiring a separate Node.js server.

Key benefits of API routes in Next.js:

  • Full-stack capability: Build backend logic within your frontend framework.
  • Serverless functions: Deploy easily on platforms like Vercel.
  • Dynamic routing: Handle endpoints with parameters.
  • Simplified setup: No need for additional backend frameworks.

Creating Your First API Route

Next.js API routes are created inside the pages/api folder. For example:

pages/
 └─ api/
     └─ hello.js

Example: Hello API Route

// pages/api/hello.js
export default function handler(req, res) {
  res.status(200).json({ message: 'Hello from Next.js API!' });
}
  • Access it at http://localhost:3000/api/hello.
  • Returns JSON: { "message": "Hello from Next.js API!" }.
  • Supports HTTP methods like GET and POST. next.js api routes example.

Handling Different HTTP Methods

You can handle multiple request methods in a single API route.

export default function handler(req, res) {
  const { method } = req;

  switch (method) {
    case 'GET':
      res.status(200).json({ message: 'This is a GET request' });
      break;
    case 'POST':
      res.status(200).json({ message: 'This is a POST request' });
      break;
    default:
      res.setHeader('Allow', ['GET', 'POST']);
      res.status(405).end(`Method ${method} Not Allowed`);
  }
}
  • GET: Retrieve data.
  • POST: Send or update data.
  • 405 Response: Handles unsupported methods gracefully.

Passing Data in API Routes

1. Query Parameters

// pages/api/greet.js
export default function handler(req, res) {
  const { name } = req.query;
  res.status(200).json({ message: `Hello, ${name}!` });
}
  • Access it via /api/greet?name=John.
  • Response: { "message": "Hello, John!" }.

2. Request Body

For POST requests, send JSON data:

export default function handler(req, res) {
  if (req.method === 'POST') {
    const { username } = req.body;
    res.status(200).json({ message: `Welcome, ${username}` });
  } else {
    res.status(405).end();
  }
}
  • Use fetch() in the frontend to send data:
fetch('/api/welcome', {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({ username: 'Alice' })
});

Dynamic API Routes Example

Dynamic routes allow you to handle parameters in the path.

// pages/api/user/[id].js
export default function handler(req, res) {
  const { id } = req.query;
  res.status(200).json({ userId: id, name: `User ${id}` });
}
  • Access /api/user/1{ "userId": "1", "name": "User 1" }.
  • Use dynamic routes for user profiles, blog posts, or product data. next.js api routes example.

Connecting API Routes to the Frontend

Fetching Data in a Component

import { useEffect, useState } from 'react';

export default function Users() {
  const [user, setUser] = useState(null);

  useEffect(() => {
    fetch('/api/user/1')
      .then(res => res.json())
      .then(data => setUser(data));
  }, []);

  if (!user) return <p>Loading...</p>;
  return <div>{user.name}</div>;
}
  • Demonstrates full-stack capability in a single Next.js app.
  • No need for external backend servers.

Middleware and API Routes

You can add authentication, logging, or validation using middleware logic inside API routes.

export default function handler(req, res) {
  const auth = req.headers.authorization;

  if (!auth) {
    return res.status(401).json({ message: 'Unauthorized' });
  }

  res.status(200).json({ message: 'Authorized access granted' });
}
  • Middleware improves security and control over your endpoints. next.js api routes example.

Error Handling in API Routes

Robust error handling ensures stability and easier debugging:

export default function handler(req, res) {
  try {
    if (req.method !== 'GET') throw new Error('Method not supported');
    res.status(200).json({ message: 'Success' });
  } catch (err) {
    res.status(500).json({ error: err.message });
  }
}
  • Returns clear error messages for clients.
  • Helps maintain production-grade APIs.

Next.js API Routes Best Practices

  • Use consistent folder structure: Organize endpoints logically.
  • Validate input data: Prevent invalid requests.
  • Return proper HTTP status codes: Use 200, 400, 404, 500 appropriately.
  • Keep routes small and focused: Each API route should handle a single responsibility.
  • Use environment variables: Store secrets securely using .env.local.

Advanced Next.js API Routes Example

1. CRUD Operations

Create a simple API for managing tasks:

let tasks = [];

export default function handler(req, res) {
  const { method } = req;

  switch (method) {
    case 'GET':
      res.status(200).json(tasks);
      break;
    case 'POST':
      const { task } = req.body;
      tasks.push(task);
      res.status(201).json({ message: 'Task added', tasks });
      break;
    case 'DELETE':
      tasks = [];
      res.status(200).json({ message: 'All tasks deleted' });
      break;
    default:
      res.status(405).end(`Method ${method} Not Allowed`);
  }
}
  • Handles GET, POST, and DELETE operations.
  • Demonstrates full backend capabilities inside Next.js. next.js api routes example.

2. Integration with External APIs

export default async function handler(req, res) {
  const response = await fetch('https://jsonplaceholder.typicode.com/todos/1');
  const data = await response.json();
  res.status(200).json(data);
}
  • Acts as a proxy to external APIs.
  • Useful for caching, validation, or aggregation of external data.

FAQs About Next.js API Routes

Q1. What are Next.js API routes?

  • Serverless backend endpoints built into Next.js for handling HTTP requests.

Q2. Can API routes handle dynamic parameters?

  • Yes, using file-based dynamic routing like [id].js.

Q3. How do I connect API routes to frontend components?

  • Use fetch() or axios to send requests to /api/your-route.

Q4. Can I handle authentication in API routes?

  • Yes, you can use headers, cookies, or JWTs for authorization checks.

Q5. Are API routes suitable for production apps?

  • Absolutely, especially with platforms like Vercel or serverless deployments.

Conclusion

Next.js API routes empower developers to build full-stack applications using a single framework. With support for GET, POST, dynamic routes, middleware, and error handling, you can handle backend logic efficiently without setting up a separate server.

By understanding how to create, secure, and connect API routes to your frontend, you can build modern, robust, and production-ready applications with Next.js. Whether you’re building a blog, dashboard, or e-commerce site, API routes make your Next.js apps flexible, scalable, and easy to maintain.

yourfriend141991@gmail.com Avatar

Leave a Reply

Your email address will not be published. Required fields are marked *