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

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

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

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

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

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

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

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

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

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

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

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

Все подборки
  • Python15 330
  • Облачные технологии11 893
  • QA вакансии3 403
  • Backend вакансии1 851
  • Инженер данных1 418
  • Продакт-менеджер845

Разработка

  • Android1 758
  • iOS1 639
  • AI вакансии884
  • Fullstack вакансии737
  • Frontend вакансии642
  • Mobile вакансии31

По стеку

  • Go8 426
  • Java5 382
  • Node.js1 732
  • Kotlin1 428
  • Rust1 388
  • .NET1 307
  • PHP554
  • C++394
  • C#374

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

  • Kubernetes6 666
  • Linux-инфраструктура4 922
  • DevOps вакансии4 864
  • Terraform / IaC3 701
  • Мониторинг и Observability1 698
  • CI/CD1 557
  • SRE510
  • Кибербезопасность246

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

  • Data Scientist779
  • Аналитик данных756
  • Бизнес-аналитик730
  • Системный аналитик96

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

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

По регионам

  • Вакансии в США40 885
  • Вакансии в Европе17 100
  • Вакансии в Канаде3 927
  • Работа в России3 874

По формату

  • Удалённые вакансии65 309
  • Релокация в США40 896
  • Гибридная работа9 847
  • Офисная работа6 766

По уровню

  • Senior вакансии36 886
  • Middle вакансии17 637
  • Junior вакансии6 023

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

Все компании
  • Wise193 вакансии
  • Rakuten189 вакансий
  • ASML164 вакансии
  • Grab134 вакансии
  • Celonis45 вакансий
  • Spotify37 вакансий
  • Adyen29 вакансий
  • Infobip28 вакансий
  • Monzo19 вакансий
  • Darktrace17 вакансий

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

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

В чём разница между reply.send() и return в обработчиках маршрутов?

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

return value и reply.send(value) равнозначны для отправки ответа; смешивать их нельзя — двойная отправка выбросит исключение. return предпочтительнее в async-обработчиках.

reply.send() vs return в обработчиках Fastify

Fastify поддерживает два равнозначных способа отправить ответ из обработчика маршрута: вернуть значение через return или явно вызвать reply.send(value). За обоими стоит один и тот же механизм сериализации.

Эквивалентность в async-обработчиках

// Вариант 1: через return (рекомендуется)
app.get('/v1', async (request, reply) => {
  return { hello: 'world' };
});

// Вариант 2: через reply.send
app.get('/v2', async (request, reply) => {
  reply.send({ hello: 'world' });
  // return здесь не нужен, но и не вреден, если возвращаем undefined
});

// Оба вернут HTTP 200 с телом {"hello":"world"}

Когда нужен reply.send()

1. Callback-стиль (не-async обработчики)

// В обычной функции нет автоматического перехвата возвращаемого значения
app.get('/callback', function (request, reply) {
  someAsyncLib(function (err, data) {
    if (err) return reply.send(err);
    reply.send(data);
  });
});

2. Ответ из middleware / хука

app.addHook('preHandler', async (request, reply) => {
  if (!request.headers.authorization) {
    reply.code(401).send({ error: 'Unauthorized' });
    // После reply.send() в хуке Fastify прерывает цепочку хуков
    // и не вызывает обработчик маршрута
  }
});

3. Потоковая передача

import { createReadStream } from 'node:fs';

app.get('/file', async (request, reply) => {
  const stream = createReadStream('/path/to/file.pdf');
  reply.type('application/pdf');
  return reply.send(stream); // stream нельзя «вернуть» через return
});

Двойная отправка — критическая ошибка

Если вызвать reply.send() и одновременно вернуть значение через return, Fastify выбросит предупреждение FST_ERR_REP_ALREADY_SENT:

// НЕПРАВИЛЬНО — двойная отправка
app.get('/wrong', async (request, reply) => {
  reply.send({ first: true }); // отправляет ответ
  return { second: true };     // FST_ERR_REP_ALREADY_SENT
});

// ПРАВИЛЬНО — только одно из двух
app.get('/right', async (request, reply) => {
  return { first: true }; // единственная точка отправки
});

reply.send() возвращает Promise

Начиная с Fastify v4, reply.send() возвращает Promise. Это позволяет использовать await reply.send() для ожидания завершения записи в сокет:

app.get('/async-send', async (request, reply) => {
  await reply.send({ ok: true });
  // Ответ уже отправлен, можно делать post-response логику
  logToAudit(request);
});

Установка статус-кода и заголовков

// Цепочки методов reply
app.post('/created', async (request, reply) => {
  reply.code(201).header('Location', '/resource/1');
  return { id: 1 }; // код 201 будет использован
});

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

  • return после reply.send() в async-функции: Fastify видит возвращённое из async-функции значение. Если вы вызвали reply.send() и не вернули undefined, фреймворк попытается отправить ответ дважды. Всегда добавляйте явный return после reply.send() в async-обработчиках: return reply.send(...).
  • return в callback внутри async-обработчика: return value внутри вложенного callback не доходит до Fastify — нужен reply.send(value).
  • Отправка после хука: если хук отправил ответ через reply.send(), но обработчик маршрута тоже вызывает reply.send(), будет ошибка. Проверяйте reply.sent: if (!reply.sent) reply.send(...).
  • Сериализация только при наличии схемы: return и reply.send() оба проходят через fast-json-stringify только если для маршрута задана response-схема. Без схемы используется обычный JSON.stringify().
  • Возврат null: return null отправит пустое тело с кодом 200, что может удивить, если ожидался 204 No Content. Для пустого ответа используйте reply.code(204).send().

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

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

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

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

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

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

Источники

  • https://fastify.dev/docs/latest/Reference/Routes/
←Предыдущий вопросКак Fastify использует JSON Schema для сериализации ответов? Почему это быстрее, чем `JSON.stringify()`?Следующий вопрос→Как выглядит поддержка TypeScript в Fastify? Как типизировать схемы маршрутов?

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

Fastifyerror-handlingrequest-lifecycle

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

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