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

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

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

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

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

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

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

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

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

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

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

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

Все подборки
  • Python7 042
  • Облачные технологии6 770
  • QA вакансии2 176
  • Android1 199
  • Инженер данных940
  • Продакт-менеджер435

Разработка

  • iOS1 135
  • Backend вакансии1 131
  • Fullstack вакансии475
  • AI вакансии458
  • Frontend вакансии404
  • Mobile вакансии27

По стеку

  • Go4 093
  • Java2 435
  • Kotlin990
  • Node.js827
  • Rust665
  • .NET525
  • PHP282
  • C++223
  • C#199

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

  • Kubernetes4 025
  • Linux-инфраструктура3 060
  • Terraform / IaC2 214
  • DevOps вакансии2 110
  • Мониторинг и Observability1 106
  • CI/CD872
  • SRE341
  • Кибербезопасность90

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

  • Аналитик данных555
  • Data Scientist513
  • Бизнес-аналитик431
  • Системный аналитик65

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

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

По регионам

  • Вакансии в США29 375
  • Вакансии в Европе11 048
  • Работа в России3 627
  • Вакансии в Канаде2 514

По формату

  • Удалённые вакансии48 640
  • Релокация в США29 375
  • Гибридная работа5 790
  • Офисная работа4 553

По уровню

  • Senior вакансии25 029
  • Middle вакансии13 245
  • Junior вакансии4 377

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

Все компании
  • Rakuten188 вакансий
  • ASML163 вакансии
  • Grab134 вакансии
  • Wise125 вакансий
  • Celonis28 вакансий
  • Infobip28 вакансий
  • Spotify24 вакансии
  • Adyen17 вакансий
  • Darktrace17 вакансий
  • Monzo13 вакансий

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

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

Как работает модель инкапсуляции (encapsulation model) в Fastify? Что такое scope плагина?

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

Каждый register() создаёт дочерний scope, который наследует декораторы и хуки родителя, но не наоборот. Обёртка fastify-plugin (fp) отключает инкапсуляцию и «всплывает» декоратор в родительский контекст.

Модель инкапсуляции в Fastify

Fastify строит дерево контекстов через систему плагинов. Каждый вызов fastify.register() создаёт дочерний scope — изолированный контейнер, в котором живут декораторы, хуки, схемы и маршруты, зарегистрированные внутри этого плагина. Родительский scope видит только то, что зарегистрировано в нём самом; дочерний наследует всё от родителя, но не наоборот.

Это достигается через avvio — внутренний загрузчик плагинов Fastify. Когда вы вызываете register, фреймворк создаёт новый экземпляр Fastify («дочерний экземпляр») и передаёт его в функцию плагина. Маршруты, добавленные в этом экземпляре, ограничены его scope.

import Fastify from 'fastify';

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

// Родительский scope — глобальный декоратор
app.decorate('db', { query: () => 'parent-db' });

// Дочерний scope (изолированный)
app.register(async function childPlugin(child) {
  // Дочерний scope наследует 'db' от родителя
  child.decorate('secret', 'token-xyz');

  child.get('/private', async (req, reply) => {
    return { secret: child.secret, db: child.db.query() };
  });
});

// Этот маршрут НЕ видит 'secret' — его нет в родительском scope
app.get('/public', async (req, reply) => {
  // app.secret === undefined
  return { db: app.db.query() };
});

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

Пробрасывание через scope: fastify-plugin

Если нужно, чтобы декоратор или хук из плагина стали доступны в родительском scope, оберните функцию плагина в fastify-plugin (fp). Это отключает инкапсуляцию для данного плагина — он «всплывает» в родительский контекст.

import fp from 'fastify-plugin';

const dbPlugin = fp(async function(fastify, opts) {
  // fastify.pg теперь будет виден во всём дереве
  fastify.decorate('pg', { query: () => 'real-db' });
}, {
  name: 'my-db-plugin',
  fastify: '4.x'
});

app.register(dbPlugin);

// Теперь app.pg доступен здесь и в любых дочерних scope
app.get('/all', async (req) => ({ result: app.pg.query() }));

Scope хуков

Хуки (onRequest, preHandler, onSend и др.) тоже подчиняются инкапсуляции. Хук, зарегистрированный в дочернем scope, выполняется только для маршрутов этого scope:

app.register(async function authScope(child) {
  child.addHook('preHandler', async (req, reply) => {
    if (!req.headers.authorization) {
      reply.code(401).send({ error: 'Unauthorized' });
    }
  });

  child.get('/me', async (req) => ({ user: 'from auth scope' }));
});

// Маршрут ниже НЕ проходит через preHandler выше
app.get('/health', async () => ({ ok: true }));

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

  • Если вы забыли обернуть плагин в fp, декоратор не будет виден в родительском scope — TypeScript не поможет, ошибка будет только в runtime при обращении к fastify.myDecorator.
  • Порядок регистрации важен: плагин, зависящий от декоратора другого плагина, должен быть зарегистрирован после него.
  • fastify-plugin обходит инкапсуляцию только для одного уровня — если плагин вложен глубоко, нужно оборачивать каждый уровень отдельно или использовать fp на всём пути.
  • Хуки, добавленные через fp-плагин, применяются глобально — легко случайно добавить аутентификацию ко всем маршрутам, включая публичные.
  • В тестах с fastify.inject() нужно дождаться await app.ready(), иначе плагины ещё не инициализированы и тест упадёт с ошибкой «decorator not found».
  • Две версии одного плагина в одном дереве конфликтуют по имени (поле name в fp): Fastify бросит ошибку дублирования — решение: передавать разные имена или использовать skipOverride.
  • Схемы JSON (через addSchema) тоже инкапсулированы — схема, добавленная в дочернем scope, не видна в родительском для валидации ответа.

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

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

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

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

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

  • Может объяснить encapsulation model и scope плагина на примере кода.
  • Называет ключевые API: decorate(), register().
  • Использует точные API Fastify, а не вымышленные hooks/decorators/methods.
  • Видит production-риски: безопасность, отказоустойчивость, логирование и тесты.

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

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

Источники

  • https://fastify.dev/docs/latest/Reference/Encapsulation/
  • https://fastify.dev/docs/latest/Reference/Plugins/
←Предыдущий вопросЧто такое lifecycle в Fastify? Перечислите основные hooks по порядку.Следующий вопрос→В каких backend-проектах Fastify является сильным выбором, а где лучше выбрать более простой или другой стек?

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

Fastifyapi-designmodule-organization