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

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

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

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

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

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

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

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

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

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

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

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

Все подборки
  • Python17 105
  • Облачные технологии14 068
  • QA вакансии3 460
  • Backend вакансии2 098
  • Инженер данных1 796
  • Продакт-менеджер1 248

Разработка

  • Android1 866
  • iOS1 699
  • Fullstack вакансии979
  • AI вакансии951
  • Frontend вакансии742
  • Mobile вакансии44

По стеку

  • Go8 651
  • Java6 544
  • Node.js2 018
  • .NET1 719
  • Kotlin1 623
  • Rust1 453
  • C#709
  • PHP683
  • C++571

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

  • Kubernetes7 761
  • DevOps вакансии6 057
  • Linux-инфраструктура5 492
  • Terraform / IaC4 259
  • CI/CD3 240
  • Мониторинг и Observability1 782
  • SRE565
  • Кибербезопасность450

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

  • Data Scientist1 127
  • Бизнес-аналитик925
  • Аналитик данных845
  • Системный аналитик154

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

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

По регионам

  • Вакансии в США43 686
  • Вакансии в Европе23 668
  • Вакансии в Канаде4 413
  • Работа в России3 909

По формату

  • Удалённые вакансии73 889
  • Релокация в США43 686
  • Гибридная работа12 392
  • Офисная работа7 088

По уровню

  • Senior вакансии42 236
  • Middle вакансии20 545
  • Junior вакансии6 653

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

Все компании
  • Wise190 вакансий
  • Rakuten189 вакансий
  • ASML166 вакансий
  • Grab138 вакансий
  • Celonis39 вакансий
  • Spotify36 вакансий
  • Adyen29 вакансий
  • Infobip28 вакансий
  • Monzo20 вакансий
  • Darktrace16 вакансий

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

КомпанииО насНовостиПубличная офертаУсловия использованияПолитика конфиденциальностиПоддержка
←К теме FastifyВсе вопросы
FastifyMiddleТеория

Как реализовать CORS в Fastify с помощью @fastify/cors?

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

@fastify/cors регистрируется как плагин и принимает объект опций с полями origin, methods, credentials, allowedHeaders. Можно задать динамическую функцию для origin, чтобы проверять домен по белому списку.

Установка и базовая настройка

Устанавливайте пакет только внутри контейнера или через проектный package.json:

npm install @fastify/cors

Минимальная регистрация разрешает все источники — подходит только для разработки:

import Fastify from 'fastify';
import cors from '@fastify/cors';

const app = Fastify({ logger: true });

await app.register(cors, {
  origin: true, // отражает Origin запроса обратно
});

await app.listen({ port: 3000 });

Продакшн-конфигурация

В боевой среде передавайте явный белый список или функцию-валидатор:

const ALLOWED_ORIGINS = [
  'https://app.example.com',
  'https://admin.example.com',
];

await app.register(cors, {
  origin: (origin, callback) => {
    // origin === undefined для server-to-server запросов без заголовка
    if (!origin || ALLOWED_ORIGINS.includes(origin)) {
      callback(null, true);
    } else {
      callback(new Error('Not allowed by CORS'), false);
    }
  },
  methods: ['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'OPTIONS'],
  allowedHeaders: ['Content-Type', 'Authorization', 'X-Request-ID'],
  exposedHeaders: ['X-Total-Count', 'X-RateLimit-Remaining'],
  credentials: true,   // разрешает куки и заголовок Authorization
  maxAge: 86400,       // кэш preflight на 24 часа
  preflight: true,     // автоматически обрабатывает OPTIONS
  strictPreflight: true,
});

Маршрут-специфичный CORS

Если разные части API должны иметь разные правила, используйте опцию hook или регистрируйте плагин в скопированном контексте:

// Публичный API — широкий CORS
app.register(async (publicCtx) => {
  publicCtx.register(cors, { origin: '*' });
  publicCtx.get('/public/data', async () => ({ ok: true }));
});

// Внутренний API — строгий CORS
app.register(async (adminCtx) => {
  adminCtx.register(cors, { origin: 'https://admin.example.com', credentials: true });
  adminCtx.get('/admin/stats', async () => ({ users: 42 }));
});

Preflight и кэширование

Браузер отправляет preflight OPTIONS-запрос перед любым "не простым" запросом. Плагин автоматически отвечает на OPTIONS со статусом 204 и правильными заголовками. Поле maxAge задаёт Access-Control-Max-Age в секундах — увеличьте его в продакшне, чтобы снизить число preflight-запросов.

Заголовки, устанавливаемые плагином

  • Access-Control-Allow-Origin — разрешённый источник
  • Access-Control-Allow-Methods — список HTTP-методов
  • Access-Control-Allow-Headers — разрешённые заголовки запроса
  • Access-Control-Expose-Headers — заголовки, доступные JS в браузере
  • Access-Control-Allow-Credentials — при credentials: true
  • Access-Control-Max-Age — TTL preflight-кэша
  • Vary: Origin — при динамическом origin, важно для CDN-кэширования

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

  • origin: '*' + credentials: true — браузер блокирует такой ответ; при credentials: true origin должен быть конкретным доменом, а не звёздочкой.
  • Отсутствие Vary: Origin — CDN закэширует ответ для одного origin и вернёт его другому. Плагин добавляет этот заголовок автоматически при динамическом origin, но убедитесь, что вы не переопределяете его вручную.
  • Порядок регистрации — плагин CORS должен быть зарегистрирован до роутов; иначе preflight OPTIONS вернёт 404 без нужных заголовков.
  • strictPreflight: false по умолчанию — без флага Fastify отвечает на OPTIONS даже без Origin и Access-Control-Request-Method, что маскирует ошибки конфигурации.
  • Не обрабатываются server-side запросы — если backend делает запросы к вашему API от имени другого сервиса, заголовок Origin будет отсутствовать; не отклоняйте такие запросы без отдельной авторизационной проверки.
  • exposedHeaders не включает Authorization — если клиент должен читать токен из заголовка ответа, добавьте его в exposedHeaders явно.
  • Динамический origin и производительность — функция-валидатор вызывается на каждый запрос; вынесите массив разрешённых доменов в Set для O(1)-поиска.
  • HTTP vs HTTPS — браузер считает http://example.com и https://example.com разными origin; в белом списке нужны оба варианта, если поддерживаются.

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

  • Что такое Fastify и каковы его основные преимущества перед Express.js?
  • Как работает система плагинов (plugin system) в Fastify? Что такое fastify-plugin и почему он нужен для инкапсуляции scope?
  • Что такое schema-based validation в Fastify и как используется JSON Schema?
  • Что такое lifecycle в Fastify? Перечислите основные hooks по порядку.

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

  • Дает общий ответ про Node.js и не называет конкретные API Fastify.
  • Не объясняет, где в lifecycle находится CORS через @fastify/cors.
  • Не разделяет validation, authorization, business logic и persistence.
  • Игнорирует ошибки, лимиты входных данных, observability и тестирование.

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

  • Может объяснить CORS через @fastify/cors на примере кода.
  • Называет ключевые API: @fastify/cors.
  • Использует точные API Fastify, а не вымышленные hooks/decorators/methods.
  • Видит production-риски: безопасность, отказоустойчивость, логирование и тесты.

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

Проверить себя по теме Fastify →

Источники

  • https://github.com/fastify/fastify-cors#readme
  • https://fastify.dev/docs/latest/Reference/Hooks/
←Предыдущий вопросКак реализовать аутентификацию в Fastify с помощью `fastify-jwt` или `@fastify/jwt`?Следующий вопрос→Что такое `@fastify/rate-limit` и как он работает?

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

Fastifyapi-designsecurity-boundaries