FastifyJuniorTechnical

Что такое Fastify и каковы его основные преимущества перед Express.js?

Fastify — высокопроизводительный Node.js-фреймворк с JSON Schema валидацией, быстрой сериализацией через fast-json-stringify и зрелой plugin-системой с инкапсуляцией контекста.

Что такое Fastify

Fastify — это веб-фреймворк для Node.js, созданный в 2016 году Маттео Колліна и Томасом Делла Вейя. Его главная цель — максимальная производительность без ущерба для удобства разработчика. Название отражает философию: фреймворк обрабатывает десятки тысяч запросов в секунду, опережая Express и Hapi по большинству бенчмарков.

Минимальный пример

import Fastify from 'fastify';

const app = Fastify({
  logger: true, // встроенный pino-логгер
});

app.get('/hello', {
  schema: {
    querystring: {
      type: 'object',
      properties: { name: { type: 'string' } },
    },
    response: {
      200: {
        type: 'object',
        properties: { greeting: { type: 'string' } },
      },
    },
  },
  async handler(request, reply) {
    const { name = 'World' } = request.query;
    return { greeting: `Hello, ${name}!` };
  },
});

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

Ключевые преимущества перед Express.js

1. Производительность

Fastify использует fast-json-stringify для сериализации ответов на основе JSON Schema — это в 2–10 раз быстрее нативного JSON.stringify(). Встроенный роутер find-my-way основан на radix tree и эффективнее линейного поиска Express.

2. Встроенная валидация через JSON Schema

В Express валидация — задача сторонних библиотек (joi, zod). В Fastify она встроена: схема описывается прямо в объекте маршрута, компилируется через ajv один раз при старте и применяется к каждому запросу без overhead:

app.post('/users', {
  schema: {
    body: {
      type: 'object',
      required: ['email'],
      properties: {
        email: { type: 'string', format: 'email' },
        age:   { type: 'integer', minimum: 18 },
      },
    },
  },
  async handler(request) {
    return request.body; // уже провалидировано
  },
});

3. Plugin-система с инкапсуляцией

Каждый плагин создаёт дочерний контекст. Декораторы, хуки и маршруты, зарегистрированные внутри плагина, не видны в родительском контексте. Это исключает случайные утечки между модулями.

4. Встроенный pino-логгер

Express не имеет встроенного логгера. Fastify интегрирует pino — самый быстрый JSON-логгер для Node.js. Каждый запрос получает уникальный reqId, что упрощает трассировку.

5. TypeScript из коробки

Fastify поставляется с полными TypeScript-определениями. Схемы маршрутов можно типизировать через generics или автоматически через @sinclair/typebox.

Когда Express по-прежнему уместен

Express имеет огромную экосистему middleware, написанных именно под него. Если проект плотно зависит от специфического Express-middleware, миграция может быть нецелесообразной.

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

  • Другая модель middleware: Express использует app.use(fn) с next(), Fastify — систему хуков (preHandler, onRequest и т.д.). Прямой перенос Express-middleware невозможен без обёртки @fastify/express.
  • Асинхронные ошибки: в Express необработанные ошибки в async-обработчиках требуют явного try/catch + next(err). Fastify перехватывает их автоматически через Promise rejection, но это поведение можно нечаянно сломать, смешав callback и async стили.
  • JSON Schema — не zod: схемы описываются в формате JSON Schema (Draft-07), а не в TypeScript-first стиле. Для TypeScript-проектов рекомендуется @sinclair/typebox или zod + fastify-type-provider-zod.
  • Plugin-инкапсуляция удивляет новичков: плагин, зарегистрированный в дочернем контексте, не виден в родительском. Для «глобальных» плагинов нужен fastify-plugin.
  • Нет автоматического body-parsing для всех типов: Fastify по умолчанию парсит только application/json. Для text/plain, application/x-www-form-urlencoded и multipart нужны отдельные плагины.

Common mistakes

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

What the interviewer is testing

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

Sources

Related topics