Новое: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.jsMiddleТеория

Что такое Middleware в Next.js и каковы его варианты использования?

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

Middleware в Next.js — Edge-функция, запускаемая до рендеринга. Используется для аутентификации, редиректов, rewrite, геолокации, A/B-тестов и rate limiting.

Структура middleware.ts

// middleware.ts (в корне проекта, рядом с app/)
import { NextRequest, NextResponse } from 'next/server';

export function middleware(request: NextRequest) {
  const { pathname } = request.nextUrl;

  // Логика здесь
  return NextResponse.next();
}

// Ограничиваем, к каким маршрутам применяется Middleware
export const config = {
  matcher: [
    '/((?!_next/static|_next/image|favicon.ico|api/public).*)',
  ],
};

Middleware в Next.js

Middleware — это Edge Runtime функция, которая выполняется перед обработкой запроса, до того как сервер отдаст страницу или API-ответ. Она запускается на Edge (Vercel) или на Node.js сервере, работает с объектами NextRequest и NextResponse и может модифицировать запрос, ответ, заголовки или сделать редирект.

Вариант 1: Аутентификация и авторизация

import { NextRequest, NextResponse } from 'next/server';
import { jwtVerify } from 'jose';

const SECRET = new TextEncoder().encode(process.env.JWT_SECRET!);

export async function middleware(req: NextRequest) {
  const token = req.cookies.get('auth_token')?.value;

  if (!token) {
    return NextResponse.redirect(new URL('/login', req.url));
  }

  try {
    await jwtVerify(token, SECRET);
    return NextResponse.next();
  } catch {
    const res = NextResponse.redirect(new URL('/login', req.url));
    res.cookies.delete('auth_token');
    return res;
  }
}

export const config = {
  matcher: ['/dashboard/:path*', '/profile/:path*', '/admin/:path*'],
};

Вариант 2: Геолокация и A/B тестирование

import { NextRequest, NextResponse } from 'next/server';

export function middleware(req: NextRequest) {
  // Заголовки геолокации (Vercel автоматически добавляет)
  const country = req.geo?.country ?? req.headers.get('x-vercel-ip-country');

  // A/B тест: 50/50 сплит
  let bucket = req.cookies.get('ab_bucket')?.value;
  if (!bucket) {
    bucket = Math.random() < 0.5 ? 'a' : 'b';
  }

  const res = NextResponse.next();
  res.cookies.set('ab_bucket', bucket, { maxAge: 60 * 60 * 24 * 30 });
  res.headers.set('x-ab-bucket', bucket);
  res.headers.set('x-country', country ?? 'unknown');

  return res;
}

Вариант 3: Редиректы и rewrite

import { NextRequest, NextResponse } from 'next/server';

export function middleware(req: NextRequest) {
  const { pathname, search } = req.nextUrl;

  // Redirect старых URL
  if (pathname.startsWith('/old-blog')) {
    return NextResponse.redirect(
      new URL(pathname.replace('/old-blog', '/blog') + search, req.url),
      { status: 301 }
    );
  }

  // Rewrite: показываем /maintenance без смены URL
  if (process.env.MAINTENANCE_MODE === 'true') {
    return NextResponse.rewrite(new URL('/maintenance', req.url));
  }

  return NextResponse.next();
}

Вариант 4: Rate limiting (с Redis)

import { NextRequest, NextResponse } from 'next/server';
import { Ratelimit } from '@upstash/ratelimit';
import { Redis } from '@upstash/redis';

const ratelimit = new Ratelimit({
  redis: Redis.fromEnv(),
  limiter: Ratelimit.slidingWindow(10, '10 s'),
});

export async function middleware(req: NextRequest) {
  const ip = req.headers.get('x-forwarded-for') ?? '127.0.0.1';
  const { success, remaining } = await ratelimit.limit(ip);

  if (!success) {
    return NextResponse.json(
      { error: 'Too many requests' },
      { status: 429, headers: { 'X-RateLimit-Remaining': String(remaining) } }
    );
  }
  return NextResponse.next();
}

export const config = {
  matcher: '/api/:path*',
};

Ключевые ограничения Edge Runtime

  • Нет доступа к файловой системе
  • Нет Node.js-специфичных API (fs, path, нативные модули)
  • Нет прямого подключения к PostgreSQL — только HTTP-запросы или Upstash Redis
  • Лимит размера Middleware: 1 MB на Vercel

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

  • Middleware выполняется при каждом запросе: без правильного matcher он будет запускаться для статики, шрифтов и изображений — это замедляет ответ.
  • Edge Runtime ограничен: нельзя использовать Prisma, pg, bcrypt и другие Node.js-зависимые пакеты напрямую.
  • Чтение тела запроса недоступно: req.body недоступен в Middleware — для проверки тела используйте Route Handler.
  • Cookies после редиректа: при NextResponse.redirect cookie из res.cookies.set() не всегда применяются — нужно тестировать поведение в конкретной среде деплоя.
  • Бесконечный редирект: если matcher перехватывает страницу /login и редирект идёт туда же — infinite loop. Всегда исключайте целевые страницы редиректа из matcher.
  • Нет Promise.all для параллельных fetch: при длинной цепочке fetch в Middleware время ответа растёт линейно — держите Middleware максимально лёгким.
  • Несовместимость с некоторыми npm-пакетами: пакеты, использующие process.env во время импорта или динамические require, могут падать в Edge Runtime.

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

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

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

  • Использовать Node-only SDK в Edge middleware
  • Делать тяжёлую логику и блокировать каждый запрос
  • Полагаться только на middleware-проверку для авторизации
  • Забывать про matcher и обрабатывать ассеты

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

  • Знает Edge vs Node runtime
  • Умеет писать matcher
  • Понимает ограничения API и bundle-size
  • Различает middleware-проверку и RSC-проверку

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

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

Источники

  • https://nextjs.org/docs/app/building-your-application/routing/middleware
  • https://nextjs.org/docs/app/api-reference/file-conventions/middleware
←Предыдущий вопросКак настроить API-маршруты в App Router с помощью Route Handlers?Следующий вопрос→Что такое Incremental Static Regeneration (ISR) и как настроить ревалидацию?

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

Next.jsauth-flowedge-functionsrequest-routing

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

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