Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

+1 467новых вакансий за сутки·93 721вакансия открыта сейчас·Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Новые вакансии в TelegramРаботодателям
Talanto
Вакансии
Компании7 267
РезюмеAIПодготовкаСтатьи
BoostТарифыBoost
Войти

Не нашли подходящее?

Пусть нужная вакансия найдёт вас сама.

  1. Подборка в TelegramНовые вакансии по вашему фильтру — сразу в бота.Подключить
  2. Мэтчи по резюмеЗагрузите резюме — покажем, где вы подходите лучше всего.Загрузить
  3. Сохранить фильтрНастройте поиск один раз и возвращайтесь к новым вакансиям.Настроить
Что нового на TalantoTalanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Для работодателей

Опубликуйте вакансию — отклики придут в ваш кабинет.

  1. Вакансиябесплатно
  2. Откликиконтакты бесплатно
  3. Наймэтапы и интервью

40 компаний публикуют вакансии напрямую · 4 401 кандидат открыт к предложениям

Разместить вакансию

Популярные направления

Все подборки
  • Python17 129
  • Облачные технологии14 088
  • QA вакансии3 457
  • Backend вакансии2 115
  • Инженер данных1 805
  • Продакт-менеджер1 262

Разработка

  • Android1 865
  • iOS1 698
  • Fullstack вакансии989
  • AI вакансии949
  • Frontend вакансии744
  • Mobile вакансии44

По стеку

  • Go8 660
  • Java6 550
  • Node.js2 020
  • .NET1 722
  • Kotlin1 619
  • Rust1 455
  • C#711
  • PHP683
  • C++572

DevOps и инфраструктура

  • Kubernetes7 769
  • DevOps вакансии6 056
  • Linux-инфраструктура5 493
  • Terraform / IaC4 266
  • CI/CD3 250
  • Мониторинг и Observability1 788
  • SRE567
  • Кибербезопасность453

Аналитика и данные

  • Data Scientist1 141
  • Бизнес-аналитик927
  • Аналитик данных854
  • Системный аналитик153

Другие направления

  • Проджект-менеджер616
  • UI/UX дизайн146
  • Ручное тестирование14

По регионам

  • Вакансии в США44 281
  • Вакансии в Европе23 875
  • Вакансии в Канаде4 475
  • Работа в России3 922

По формату

  • Удалённые вакансии75 035
  • Релокация в США44 281
  • Гибридная работа12 401
  • Офисная работа7 079

По уровню

  • Senior вакансии42 679
  • Middle вакансии20 894
  • Junior вакансии6 722

Сейчас нанимают

Все компании
  • Wise190 вакансий
  • Rakuten189 вакансий
  • ASML166 вакансий
  • Grab137 вакансий
  • Celonis39 вакансий
  • Spotify37 вакансий
  • Adyen28 вакансий
  • Infobip28 вакансий
  • Monzo20 вакансий
  • Darktrace16 вакансий

Вакансии из 344 источников: карьерные страницы компаний и джоб-борды.

КомпанииО насНовостиПубличная офертаУсловия использованияПолитика конфиденциальностиПоддержка
←К теме Next.jsВсе вопросы
Next.jsJuniorКодинг

Как настроить API-маршруты в App Router с помощью Route Handlers?

В закладки
Сначала попробуйте ответить сами30 секунд
Сравнить с ответом ↓

Route Handlers в App Router — файлы route.ts с именованными экспортами GET/POST/PUT/DELETE и т.д., работающие через стандартный Web API (NextRequest/NextResponse). Params в Next.js 15 — асинхронный Promise.

Базовая структура

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

export async function GET(req: NextRequest) {
  return NextResponse.json({ message: 'Hello, World!' });
}

export async function POST(req: NextRequest) {
  const body = await req.json();
  return NextResponse.json({ received: body }, { status: 201 });
}

// Поддерживаемые методы: GET, POST, PUT, PATCH, DELETE, HEAD, OPTIONS

Route Handlers в Next.js App Router

Route Handlers — это аналог API-маршрутов из Pages Router, написанный по стандарту Web API (Request/Response). Файл route.ts внутри папки app/ создаёт HTTP-эндпоинт. Каждый именованный экспорт соответствует HTTP-методу.

Доступ к параметрам URL

// app/api/users/[id]/route.ts
import { NextRequest, NextResponse } from 'next/server';

export async function GET(
  req: NextRequest,
  { params }: { params: Promise<{ id: string }> } // в Next.js 15 params — Promise
) {
  const { id } = await params;

  const user = await db.users.findUnique({ where: { id } });
  if (!user) {
    return NextResponse.json({ error: 'User not found' }, { status: 404 });
  }

  return NextResponse.json(user);
}

Работа с query-параметрами

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

export async function GET(req: NextRequest) {
  const { searchParams } = req.nextUrl;
  const page = parseInt(searchParams.get('page') ?? '1');
  const limit = parseInt(searchParams.get('limit') ?? '20');
  const category = searchParams.get('category') ?? undefined;

  const products = await db.products.findMany({
    where: { category },
    skip: (page - 1) * limit,
    take: limit,
  });

  return NextResponse.json({ products, page, limit });
}

Работа с заголовками и cookies

// app/api/profile/route.ts
import { NextRequest, NextResponse } from 'next/server';
import { cookies, headers } from 'next/headers';

export async function GET(req: NextRequest) {
  // Вариант 1: через req.cookies
  const token = req.cookies.get('auth_token')?.value;

  // Вариант 2: через next/headers (работает в любом серверном контексте)
  const cookieStore = await cookies();
  const userId = cookieStore.get('user_id')?.value;

  const headersList = await headers();
  const userAgent = headersList.get('user-agent');

  if (!userId) {
    return NextResponse.json({ error: 'Unauthorized' }, { status: 401 });
  }

  const profile = await db.users.findUnique({ where: { id: userId } });
  return NextResponse.json(profile);
}

Обработка FormData и файлов

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

export async function POST(req: NextRequest) {
  const formData = await req.formData();
  const file = formData.get('file') as File | null;
  const name = formData.get('name') as string;

  if (!file) {
    return NextResponse.json({ error: 'No file provided' }, { status: 400 });
  }

  const bytes = await file.arrayBuffer();
  const buffer = Buffer.from(bytes);

  // Сохраняем в S3/MinIO
  await s3.putObject({
    Bucket: process.env.S3_BUCKET!,
    Key: `uploads/${Date.now()}-${file.name}`,
    Body: buffer,
    ContentType: file.type,
  });

  return NextResponse.json({ success: true, name });
}

Streaming Response

// app/api/stream/route.ts
export async function GET() {
  const stream = new ReadableStream({
    async start(controller) {
      const encoder = new TextEncoder();
      const lines = ['Первая строка\n', 'Вторая строка\n', 'Готово\n'];

      for (const line of lines) {
        controller.enqueue(encoder.encode(line));
        await new Promise(resolve => setTimeout(resolve, 500));
      }
      controller.close();
    },
  });

  return new Response(stream, {
    headers: { 'Content-Type': 'text/event-stream' },
  });
}

Подводные камни

  • route.ts нельзя размещать рядом с page.tsx: в одной папке не может быть одновременно page.tsx и route.ts — они конфликтуют.
  • GET Route Handlers в Next.js 15 динамические по умолчанию: в отличие от Next.js 14, GET-маршруты больше не кэшируются автоматически. Добавьте export const dynamic = 'force-static' для кэширования.
  • params — Promise в Next.js 15: забытый await params даст [object Promise] вместо реального значения и сложные для отладки баги.
  • req.body нельзя читать дважды: после await req.json() тело запроса исчерпано — нельзя повторно вызвать req.formData() или req.text().
  • CORS требует ручной настройки: Route Handlers не добавляют CORS-заголовки автоматически — нужно явно добавить Access-Control-Allow-Origin и обработать OPTIONS-запрос.
  • Отсутствие middleware-like цепочки: нет встроенного аналога Express middleware — для общей логики (логирование, авторизация) создайте HOF-обёртку (withAuth(handler)).
  • Большие файлы зависают без стриминга: при загрузке больших файлов через req.arrayBuffer() весь файл буферизуется в памяти — для файлов > 10 MB используйте стриминг.

Частые вопросы на собеседовании

  • Как оптимизировать производительность Next.js-приложения?
  • Что такое React Server Components в Next.js? Чем они отличаются от Client Components?
  • В каких типах frontend-проектов Next.js даёт реальный выигрыш, а где будет избыточен или неудачен?
  • Объясните SSR, SSG, ISR и CSR в Next.js. Когда использовать каждый подход?

Типичные ошибки

  • Полагаться на встроенную CORS-настройку
  • Возвращать NextResponse.json({error}) без статуса 4xx/5xx
  • Кешировать персональные GET без dynamic = 'force-dynamic'
  • Использовать Route Handler там, где достаточно Server Action

Что проверяет интервьюер

  • Знает соответствие экспорт = метод
  • Использует zod/валидацию входа
  • Различает Edge и Node runtime
  • Понимает, когда выбирать handler vs Server Action

Как вы знаете этот вопрос?

Проверить себя по теме Next.js →

Источники

  • https://nextjs.org/docs/app/building-your-application/routing/route-handlers
  • https://nextjs.org/docs/app/api-reference/file-conventions/route
←Предыдущий вопросПредставьте, приложение на Next.js стало медленно открываться или часто перерисовываться. Как вы будете искать причину?Следующий вопрос→Что такое Middleware в Next.js и каковы его варианты использования?

Связанные темы

Next.jsapi-designnextjs-routingrequest-validation

Вакансии с этим навыком

  • Fullstack-разработчик (Middle+ / Senior)
  • Fullstack-разработчик
  • Fullstack Developer (React, Next.js, PHP, AI)
  • Senior Full-stack Engineer | AI
  • Head of SEO & GEO