Гид по технологиям

API в Next.js: маршруты, примеры и лучшие практики

6 min read Веб-разработка Обновлено 08 Apr 2026
API в Next.js: маршруты, примеры и лучшие практики
API в Next.js: маршруты, примеры и лучшие практики

Кратко: В этой статье показано, как создавать серверные API-маршруты внутри проекта Next.js, обрабатывать запросы GET и POST и потреблять их с фронтенда. Приведены практические советы, сценарии, альтернативы и чек-листы для безопасной и устойчивой реализации.

Женщина пишет «use apis» на белой доске

Исчезли времена, когда для сайта нужно было заводить отдельный бэкенд. С файловой маршрутизацией API в Next.js вы можете писать серверную логику прямо в проекте Next.js и упростить разработку полнофункциональных приложений.

Next.js — это мета‑фреймворк для React с набором возможностей, которые упрощают создание production‑готовых веб‑приложений. Ниже показано, как создать REST API в Next.js и потреблять данные этого API на странице Next.js.

Что вы узнаете

  • Как создать проект Next.js и добавить API‑маршруты.
  • Как реализовать обработку GET и POST запросов.
  • Как с фронтенда вызывать свои маршруты и обновлять UI.
  • Лучшие практики безопасности и развертывания.

Создание проекта Next.js с помощью create-next-app

Вы можете создать новый проект Next.js с помощью инструмента CLI create-next-app. Он установит необходимые пакеты и файлы для старта.

Запустите эту команду в терминале, чтобы создать папку проекта api-routes. В процессе может понадобиться установить create-next-app:

npx create-next-app api-routes  

Когда команда завершит работу, откройте папку api-routes, чтобы начать создавать маршруты API.

Маршрутизация API в Next.js

API‑маршруты выполняются на сервере и полезны для сохранения данных в базе, обращения к сторонним API без проблем с CORS и реализации любой серверной логики.

В Next.js файлы маршрутов API нужно размещать в папке /pages/api. Для каждого файла в этой папке Next.js генерирует конечную точку. Если вы добавите user.js в /pages/api, Next.js создаст endpoint по адресу http://localhost:3000/api/user.

Базовый API‑маршрут в Next.js имеет такой синтаксис:

export default function handler(req, res) {  
  res.status(200).json({ name: 'John Doe' })  
}  

Не забудьте экспортировать handler — это обязательный контракт для работы маршрута.

Создание маршрутов API

Добавьте файл todo.js в папку /pages/api, чтобы создать маршрут для работы со списком задач (todos).

Мокирование «базы данных» задач

Для примера реализуем GET‑эндпоинт, возвращающий список задач. В обучающих целях здесь используется массив объектов вместо реальной базы данных — вы всегда можете подключить MongoDB, MySQL или другую СУБД.

Создайте массив todos в корне приложения (файл todo.js) и добавьте следующие данные:

export const todos = [  
  {  
    id: 1,  
    todo: "Do something nice for someone I care about",  
    completed: true,  
    userId: 26,  
  },  
  {  
    id: 2,  
    todo: "Memorize the fifty states and their capitals",  
    completed: false,  
    userId: 48,  
  },  
  // other todos  
];  

Эти данные взяты с DummyJSON — сервиса с мок‑данными. Вы можете использовать точный ответ из их todos‑эндпоинта для тестов.

Далее создайте маршрут /pages/api/todos.js и добавьте обработчик:

import { todos } from "../../todo";  
   
export function handler(req, res) {  
  const { method } = req;  
   
  switch (method) {  
    case "GET":  
      res.status(200).json(todos);  
      break;  
    case "POST":  
      const { todo, completed } = req.body;  
      todos.push({  
        id: todos.length + 1,  
        todo,  
        completed,  
      });  
      res.status(200).json(todos);  
      break;  
    default:  
      res.setHeader("Allow", ["GET", "POST"]);  
      res.status(405).end(`Method ${method} Not Allowed`);  
      break;  
  }  
}  

Этот маршрут обрабатывает GET и POST: GET возвращает все задачи, POST добавляет новую задачу в массив. Для прочих методов возвращается ошибка 405.

Потребление API на фронтенде

Вы создали API, возвращающее JSON со списком todos. Теперь напишем функцию fetchTodos, которая получает данные с конечной точки. В примере используется fetch, но можно применять и Axios.

Пример компонента, который получает задачи по клику и отображает их:

import Head from "next/head";  
import { useState } from "react";   
   
export default function Home() {  
  const [todos, settodos] = useState([]);  
   
  const fetchTodos = async () => {  
    const response = await fetch("/api/todos");  
    const data = await response.json();  
    settodos(data);  
  };  
   
  return (  
      
        
        Create Next App  
          
          
        
      
        Get todos         
              {todos.map((todo) => {             return (               
  •                 {todo.todo}:{todo.completed}.               
  •             );           })}         
      
    
  ); }

Список отобразит задачи после выполнения fetch.

Пример сохранения (POST)

Для POST создайте функцию saveTodo, которая делает fetch с методом POST и телом JSON. Ответ API — обновлённый список задач, который сохраняется в состоянии todos:

const saveTodo = async () => {  
    const response = await fetch("/api/todos", {  
        method: "POST",  
        body: JSON.stringify(newTodo),  
        headers: {  
            "Content-Type": "application/json",  
        },  
    });  
   
    const data = await response.json();  
    settodos(data);  
};  

И форма для ввода нового todo:

import Head from "next/head";  
import { useReducer, useState } from "react";  
import styles from "../styles/Home.module.css";  
   
export default function Home() {  
  const [todos, settodos] = useState([]);  
   
  const [newTodo, setnewTodo] = useState({  
    todo: "",  
    completed: false,  
  });  
   
  const fetchTodos = async () => {  
    // fetchTodos  
  };  
  
  const saveTodo = async (e) => {  
    const response = await fetch("/api/todos", {  
      method: "POST",  
      body: JSON.stringify(newTodo),  
      headers: {  
        "Content-Type": "application/json",  
      },  
    });  
   
    const data = await response.json();  
    settodos(data);  
  };  
   
  const handleChange = (e) => {  
    setnewTodo({  
      todo: e.target.value,  
    });  
  };  
   
  const handleSubmit = (e) => {  
    e.preventDefault();  
    saveTodo();  
    setnewTodo({  
      todo: '',  
    });  
  };  
   
  return (  
      
        
        Create Next App  
          
          
        
      
// Fetches the todo items when clicked         Get todos   // Saves a new todo item when submitted                                      
              {// list todo items}         
      
    
  ); }

Обработчик добавляет новую задачу при каждом submit и обновляет состояние todos на основе ответа API.

Лучшие практики

  • Разделяйте ответственность: маршруты API должны выполнять только серверные задачи (валидация, доступ к БД, аутентификация). Логика отображения остаётся в компонентах React.
  • Валидация входных данных на сервере: всегда проверяйте тело запроса и типы полей.
  • Ограничение методов и корректные коды ответа: 405 для неподдерживаемых методов, 400 для неверных данных, 500 для серверных ошибок.
  • Используйте environment‑переменные для секретов и строк подключения.
  • Кеширование и сжатие там, где это уместно.

Важно: для production не храните данные в памяти процесса (как массив в файле). Это подходит только для локальной разработки и демонстраций.

Когда маршруты API Next.js не подходят

  • Нужна масштабируемая отдельная сервисная архитектура с собственным циклом деплоймента — предпочтительнее выделенный бэкенд или микросервис.
  • Требуется долгоживущий фон‑процесс или очередь задач — используйте отдельные worker‑процессы или managed‑сервисы.
  • Нужна совместимость с архитектурами, где frontend и backend деплоятся независимо с разными командами — тогда отдельный API удобнее.

Альтернативные подходы

  • Сервер без Next.js: Express, Fastify, NestJS.
  • Отдельные серверless‑функции (AWS Lambda, Vercel Functions) — подходят для автономных endpoint’ов.
  • BFF (Backend for Frontend): отдельный слой между UI и микросервисами.

Мини‑методология: шаги для быстрой реализации API в проекте Next.js

  1. Инициализация проекта: npx create-next-app .
  2. Создать структуру: /pages/api/.js.
  3. Продумать модели и валидацию данных.
  4. Реализовать обработчики методов (GET/POST/PUT/DELETE по необходимости).
  5. Локально протестировать через curl или Postman.
  6. Добавить логи и обработку ошибок.
  7. Перевести хранение данных на реальную БД перед деплоем.
  8. Обновить окружение и настроить CI/CD.

Чек-листы по ролям

  • Разработчик:

    • Реализовал валидацию и тесты для эндпоинта.
    • Добавил обработку ошибок и возвращаемые статусы.
    • Не хранит секреты в репозитории.
  • Ревьювер/QA:

    • Протестировал GET/POST и сценарии ошибочных запросов.
    • Проверил заголовки CORS и авторизации.
  • DevOps:

    • Настроил переменные окружения.
    • Обеспечил резервирование и бэкапы БД.

Безопасность и приватность

  • Всегда валидируйте и нормализуйте входные данные.
  • Ограничьте размер тел запросов и избегайте выполнения произвольного кода на основе входа.
  • Храните секреты в менеджере секретов или переменных окружения.
  • Для персональных данных соблюдайте требования локального законодательства о защите данных (например, GDPR в ЕС): документируйте цели обработки, поддерживайте право удаления и доступа.

Критерии приёмки

  • GET /api/todos возвращает 200 и массив задач в формате JSON.
  • POST /api/todos с корректным JSON добавляет задачу и возвращает обновлённый массив.
  • Для неподдерживаемых методов возвращается 405 и заголовок Allow.
  • Ошибки валидации приводят к 400 с читаемым сообщением.

Факты и подсказки

  • Путь для API: /pages/api — каждый файл превращается в endpoint.
  • По умолчанию Next.js запускается на порту 3000 при локальном старте.
  • Типичные методы: GET, POST, PUT, DELETE.

Краткое резюме

API‑маршруты Next.js позволяют быстро добавить серверную логику в тот же проект, что и фронтенд. Для небольших или средних приложений это удобное и быстрое решение. Для production‑нагрузок и сложной серверной логики стоит продумать отдельную архитектуру и хранение данных вне памяти процесса.

Ключевые рекомендации: валидируйте вход, не храните данные в памяти для production, используйте environment‑переменные и планируйте развертывание с учётом масштабирования.

Глоссарий

  • Endpoint: URL, по которому доступен API.
  • Handler: функция, обрабатывающая входящие HTTP‑запросы.
  • CORS: политика браузера, ограничивающая кросс‑доменные запросы.
Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Установка GitHub CLI на Linux
Разработка

Установка GitHub CLI на Linux

Как установить Epic Games и играть на Linux
Linux

Как установить Epic Games и играть на Linux

Как сделать Stitch в TikTok — полное руководство
Социальные сети

Как сделать Stitch в TikTok — полное руководство

TEXTSPLIT, TEXTBEFORE, TEXTAFTER в Excel
Excel

TEXTSPLIT, TEXTBEFORE, TEXTAFTER в Excel

Изменение значков и цветов в приложении «Дом»
Умный дом

Изменение значков и цветов в приложении «Дом»

Исправить уведомления WhatsApp в Windows 10
Технологии

Исправить уведомления WhatsApp в Windows 10