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

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

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

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

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

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

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

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

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

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

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

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

Все подборки
  • Python17 103
  • Облачные технологии14 031
  • QA вакансии3 458
  • Backend вакансии2 078
  • Инженер данных1 772
  • Продакт-менеджер1 238

Разработка

  • Android1 866
  • iOS1 699
  • Fullstack вакансии973
  • AI вакансии948
  • Frontend вакансии736
  • Mobile вакансии44

По стеку

  • Go8 651
  • Java6 542
  • Node.js2 017
  • .NET1 719
  • Kotlin1 623
  • Rust1 453
  • C#709
  • PHP682
  • C++570

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

  • Kubernetes7 748
  • DevOps вакансии6 051
  • Linux-инфраструктура5 485
  • Terraform / IaC4 252
  • CI/CD3 239
  • Мониторинг и Observability1 781
  • SRE560
  • Кибербезопасность446

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

  • Data Scientist1 114
  • Бизнес-аналитик915
  • Аналитик данных828
  • Системный аналитик154

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

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

По регионам

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

По формату

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

По уровню

  • Senior вакансии41 839
  • Middle вакансии20 268
  • Junior вакансии6 588

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

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

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

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

Как Fastify обрабатывает асинхронные обработчики маршрутов по сравнению с Express?

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

Fastify нативно поддерживает async/await в обработчиках: брошенный Error автоматически превращается в JSON-ответ с кодом 500. Express требует явного вызова next(err), иначе ошибка «провалится» и сервер зависнет.

Сравнение с Express

В Express async-обработчик не перехватывается автоматически. Если внутри async (req, res, next) => {} выбрасывается ошибка, Express «не видит» её, если не вызвать next(err) вручную или не обернуть весь обработчик в try/catch. Это классический источник утечек запросов (hanging requests) — сервер просто не отвечает клиенту.

// Fastify: бросить достаточно
fastify.get("/users/:id", async (request, reply) => {
  const user = await db.findUserById(request.params.id);
  if (!user) throw fastify.httpErrors.notFound("User not found");
  return user; // автоматически сериализуется
});

// Express: нужен явный next(err)
app.get("/users/:id", async (req, res, next) => {
  try {
    const user = await db.findUserById(req.params.id);
    if (!user) return res.status(404).json({ error: "Not found" });
    res.json(user);
  } catch (err) {
    next(err); // без этого запрос зависнет
  }
});

Как Fastify обрабатывает async-обработчики

В Fastify обработчик маршрута может быть обычной async-функцией, возвращающей значение. Fastify сам сериализует возвращаемое значение через fast-json-stringify по схеме маршрута и отправляет ответ. Если async-функция выбрасывает исключение, Fastify перехватывает его через внутренний try/catch и передаёт в setErrorHandler. Явно вызывать reply.send() не нужно — хотя это тоже допустимо.

Lifecycle и hook-интеграция

Fastify выполняет async-обработчики внутри строгого lifecycle: onRequest → preParsing → preValidation → preHandler → handler → preSerialization → onSend → onResponse. Каждый hook тоже может быть async-функцией и выбрасывать ошибки. Хук onError позволяет перехватывать ошибки до отправки ответа — например, для логирования или трансформации.

fastify.setErrorHandler(async (error, request, reply) => {
  request.log.error({ err: error, reqId: request.id }, "Unhandled error");
  const statusCode = error.statusCode ?? 500;
  return reply.status(statusCode).send({
    error: statusCode < 500 ? error.message : "Internal Server Error",
  });
});

Параллельные async-операции

Поскольку Fastify не блокирует event loop между хуками, несколько параллельных запросов обрабатываются конкурентно. Важно: если в async-обработчике используется reply.hijack(), Fastify полностью передаёт управление разработчику — автоматической сериализации и перехвата ошибок не будет.

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

  • Возврат undefined из async-обработчика без reply.send() отправит пустой 200 — часто нежелательно; лучше всегда возвращать явное значение или использовать reply.
  • Использование reply.send() и возврата значения одновременно приведёт к ошибке «Reply already sent».
  • Ошибки в onResponse-хуке не могут изменить ответ — он уже отправлен; перехватывать критические ошибки нужно в onSend.
  • В Express без express-async-errors или ручного try/catch async-ошибки «глотаются» — сервер виснет без ответа клиенту.
  • Fastify fast-json-stringify сериализует только поля, описанные в response schema; лишние поля удаляются — это фича, но может удивить.
  • Не путать throw new Error() с throw fastify.httpErrors.badRequest(): первое даёт 500, второе — 400 с правильным statusCode.
  • reply.hijack() отключает автоматику — при использовании SSE или WebSocket нужно самостоятельно завершать соединения в onClose.
  • Тяжёлые синхронные операции внутри async-обработчика блокируют event loop для всех параллельных запросов.

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

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

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

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

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

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

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

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

Источники

  • https://fastify.dev/docs/latest/Reference/Errors/
  • https://fastify.dev/docs/latest/Reference/Routes/
←Предыдущий вопросКак добавить кастомные декораторы к объектам `fastify`, `request` и `reply`?Следующий вопрос→Как управлять подключениями к базе данных в Fastify (connection pooling, scoping плагинов)?

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

Fastifyerror-handlingrequest-lifecycle