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

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

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

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

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

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

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

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

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

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

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

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

Все подборки
  • Python9 224
  • Облачные технологии4 076
  • QA вакансии1 588
  • Android1 322
  • Инженер данных805
  • Продакт-менеджер368

Разработка

  • Backend вакансии1 317
  • iOS1 239
  • AI вакансии608
  • Fullstack вакансии523
  • Frontend вакансии456
  • Mobile вакансии28

По стеку

  • Go5 445
  • Java3 175
  • Kotlin1 119
  • Node.js1 026
  • Rust949
  • .NET666
  • PHP311
  • C#210
  • C++204

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

  • DevOps вакансии2 713
  • Kubernetes2 308
  • Linux-инфраструктура1 890
  • Terraform / IaC1 406
  • CI/CD842
  • Мониторинг и Observability645
  • SRE226
  • Кибербезопасность84

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

  • Аналитик данных483
  • Data Scientist469
  • Бизнес-аналитик349
  • Системный аналитик48

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

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

По регионам

  • Вакансии в США24 791
  • Вакансии в Европе9 439
  • Работа в России2 924
  • Вакансии в Канаде2 178

По формату

  • Удалённые вакансии43 505
  • Релокация в США24 791
  • Гибридная работа3 370
  • Офисная работа2 525

По уровню

  • Senior вакансии20 898
  • Middle вакансии12 438
  • Junior вакансии3 864

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

Все компании
  • Wise191 вакансия
  • Rakuten188 вакансий
  • ASML163 вакансии
  • Grab134 вакансии
  • Celonis48 вакансий
  • Spotify37 вакансий
  • Adyen28 вакансий
  • Infobip28 вакансий
  • Monzo20 вакансий
  • Darktrace17 вакансий

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

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

Как работает plugin encapsulation в Fastify и почему это важно для больших приложений?

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

Plugin encapsulation в Fastify: каждый register() создаёт дочерний контекст, где декорации, хуки и роуты изолированы от родителя. fastify-plugin пробивает инкапсуляцию, делая декорации видимыми в родительском scope. Это позволяет строить модульные приложения без глобального состояния.

Демонстрация инкапсуляции

import Fastify from 'fastify';

const app = Fastify();

// Плагин A — изолированный scope
await app.register(async function pluginA(instance) {
  instance.decorate('serviceA', { greet: () => 'Hello from A' });

  // Работает внутри scope
  instance.get('/a', async () => instance.serviceA.greet());
});

// Плагин B — другой scope
await app.register(async function pluginB(instance) {
  // ОШИБКА: instance.serviceA === undefined
  // Декорация из pluginA недоступна здесь
  instance.get('/b', async () => {
    // @ts-expect-error
    return instance.serviceA?.greet() ?? 'not available';
  });
});

await app.ready();

Что такое plugin encapsulation

В Fastify каждый вызов app.register(plugin) создаёт новый дочерний контекст (scope). Этот контекст наследует всё от родителя, но изменения внутри (новые декорации, хуки, роуты) не видны в родительском или соседних scope. Это фундаментальный принцип архитектуры Fastify.

fastify-plugin: пробитие инкапсуляции

Когда плагин должен быть доступен во всём приложении (соединение с БД, конфиг, auth), оберните его в fastify-plugin:

import fp from 'fastify-plugin';
import fastifyPostgres from '@fastify/postgres';

// БЕЗ fp — декорация app.pg доступна только внутри этого scope
// С fp — декорация поднимается в родительский scope
export const dbPlugin = fp(
  async function(app) {
    await app.register(fastifyPostgres, {
      connectionString: process.env.DATABASE_URL,
    });
  },
  {
    name: 'db',
    fastify: '>=4.0.0',
    dependencies: ['config'], // ожидает что плагин 'config' уже загружен
  }
);

// Теперь app.pg доступен во всём приложении

Практический пример: auth scope

// Публичные роуты — без аутентификации
await app.register(async function publicRoutes(instance) {
  instance.get('/health', async () => ({ status: 'ok' }));
  instance.post('/auth/login', loginHandler);
});

// Защищённые роуты — с preHandler
await app.register(
  async function protectedRoutes(instance) {
    // Хук применяется ТОЛЬКО к роутам внутри этого scope
    instance.addHook('preHandler', instance.authenticate);

    instance.get('/users/me', getMeHandler);
    instance.get('/orders', getOrdersHandler);
  },
  { prefix: '/api/v1' }
);

Хук authenticate не затронет /health и /auth/login — они в другом scope.

Граф зависимостей плагинов

// Правильный порядок загрузки:
// config → db → redis → auth → routes

const app = Fastify();
await app.register(configPlugin);  // декорирует app.config
await app.register(dbPlugin);       // depends on 'config', декорирует app.pg
await app.register(redisPlugin);    // depends on 'config'
await app.register(authPlugin);     // depends on 'db'
await app.register(routesPlugin);   // depends on 'auth', 'db', 'redis'

Почему это важно для больших приложений

  • Изоляция middleware: хуки rate-limit или специфические преобразования применяются только к нужным роутам.
  • Тестируемость: каждый domain-плагин можно протестировать отдельно, передав mock-экземпляр Fastify.
  • Предотвращение коллизий: два плагина могут использовать одно имя декорации внутри своих scope без конфликта.
  • Явные зависимости: через dependencies в fastify-plugin система стартует только если все зависимости доступны.

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

  • Забытый fp() на плагине с декорацией: роуты в другом scope получат undefined в runtime без ошибки при старте — только при первом запросе.
  • Двойная регистрация плагина с одним именем бросает ошибку FST_ERR_DEC_ALREADY_PRESENT — используйте fastify-plugin и name для идемпотентной регистрации.
  • Хук, зарегистрированный через app.addHook в корневом scope, применяется ко ВСЕМ роутам включая дочерние — легко случайно добавить auth на публичные роуты.
  • Плагин внутри register без await может запуститься после старта сервера — всегда await app.register().
  • TypeScript не знает о динамических декорациях — без augmentation fastify.d.ts будут ошибки типов или опасные any.
  • При использовании @fastify/autoload порядок загрузки алфавитный — если plugin B зависит от A, убедитесь через dependencies или именование файлов (01-a.ts, 02-b.ts).

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

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

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

  • Отвечать определением без production-сценария.
  • Не называть runtime boundary, security boundary или failure mode.
  • Игнорировать версию API, observability и тестовую проверку.

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

  • Объясняет механизм своими словами и без выдуманных API.
  • Называет реальные риски, диагностику и критерий корректности.
  • Связывает ответ с текущей документацией и миграционными ограничениями.

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

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

Источники

  • https://fastify.dev/docs/latest/Reference/Server/
  • https://fastify.dev/docs/latest/Reference/Plugins/

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

Fastifyfastify-productionrisk-analysistechnical-depth