Розробка бекенду сайту на Node.js (Fastify)

Наша компанія займається розробкою, підтримкою та обслуговуванням сайтів будь-якої складності. Від простих односторінкових сайтів до масштабних кластерних систем, побудованих на мікро сервісах. Досвід розробників підтверджено сертифікатами від вендорів.
Розробка та обслуговування будь-яких видів сайтів:
Інформаційні сайти або веб-програми
Сайти візитки, landing page, корпоративні сайти, онлайн каталоги, квіз, промо-сайти, блоги, ресурси новин, інформаційні портали, форуми, агрегатори
Сайти або веб-програми електронної комерції
Інтернет-магазини, B2B-портали, маркетплейси, онлайн-обмінники, кешбек-сайти, біржі, дропшиппінг-платформи, парсери товарів
Веб-програми для управління бізнес-процесами
CRM-системи, ERP-системи, корпоративні портали, системи управління виробництвом, парсери інформації
Сайти або веб-програми електронних послуг
Дошки оголошень, онлайн-школи, онлайн-кінотеатри, конструктори сайтів, портали надання електронних послуг, відеохостинги, тематичні портали

Це лише деякі з технічних типів сайтів, з якими ми працюємо, і кожен із них може мати свої специфічні особливості та функціональність, а також бути адаптованим під конкретні потреби та цілі клієнта.

Пропоновані послуги
Показано 1 з 1 послугУсі 2065 послуг
Розробка бекенду сайту на Node.js (Fastify)
Середня
від 1 тижня до 3 місяців
Часті питання
Наші компетенції:
Етапи розробки
Останні роботи
  • image_website-b2b-advance_0.png
    Розробка сайту компанії B2B ADVANCE
    1262
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1171
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    874
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1094
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    831
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Розробка веб-сайту для компанії ФІКСПЕР
    851

Розробка веб-бекенду на Node.js (Fastify)

Fastify вибирають не за хайпом—вибирають, коли пропускна спроможність має значення. Фреймворк обробляє до 76 000 запитів на секунду на одному ядрі в синтетичних тестах, це різниця відчувається в реальних проектах з high-frequency API: price-feed, real-time аналітика, публічні API з непередбачуваним трафіком.

Архітектура й організація коду

Fastify побудований навколо концепції плагінів—кожен плагін ізольований контекст зі своїми декораторами, хуками, обробниками:

// plugins/db.js
import fp from 'fastify-plugin'
import { Pool } from 'pg'

async function dbPlugin(fastify, opts) {
  const pool = new Pool({ connectionString: opts.connectionString })
  fastify.decorate('db', pool)
  fastify.addHook('onClose', async () => pool.end())
}

export default fp(dbPlugin, { name: 'db' })

Роут зі схемою й валідацією

// routes/products/index.js
export default async function productsRoutes(fastify) {
  fastify.get('/', {
    schema: {
      querystring: {
        limit: { type: 'integer', minimum: 1, maximum: 100 },
        offset: { type: 'integer', minimum: 0 }
      },
      response: {
        200: { type: 'array', items: { $ref: 'Product#' } }
      }
    }
  }, async (request, reply) => {
    const { limit, offset } = request.query
    return await fastify.db.query('SELECT * FROM products LIMIT $1 OFFSET $2', [limit, offset])
  })
}

Схема маршруту—не документація, це входова валідація й серіалізація відповіді одночасно. Fastify використовує ajv для валідації й fast-json-stringify для серіалізації. Відповідь серіалізується в 2–5 разів швидше ніж JSON.stringify.

Аутентифікація з JWT

fastify.decorate('authenticate', async function(request, reply) {
  try {
    await request.jwtVerify()
  } catch (err) {
    reply.send(err)
  }
})

fastify.get('/profile', {
  onRequest: [fastify.authenticate]
}, async (request) => {
  return request.user
})

Ролеве дозвіл через preHandler хук:

const requireRole = (role) => async (request, reply) => {
  if (request.user.role !== role) {
    return reply.code(403).send({ error: 'Forbidden' })
  }
}

fastify.delete('/users/:id', {
  onRequest: [fastify.authenticate],
  preHandler: [requireRole('admin')]
}, handler)

База даних: вибір ORM

Інструмент Коли використовувати
pg + type-safe wrapper Повний контроль SQL, критична продуктивність
Drizzle ORM Type-safe SQL без overhead Prisma
Prisma Швидкий старт, auto types, команда знає
Knex Query builder, без ORM overhead

Drizzle оптимальний для нових Node.js 18+ проектів:

import { pgTable, serial, varchar } from 'drizzle-orm/pg-core'
import { drizzle } from 'drizzle-orm/node-postgres'

const users = pgTable('users', {
  id: serial('id').primaryKey(),
  email: varchar('email').notNull().unique()
})

const result = await db.select().from(users).where(eq(users.email, email))

Кешування з Redis

fastify.register(fastifyRedis, { url: process.env.REDIS_URL })

fastify.get('/catalog', async (request, reply) => {
  const cacheKey = `catalog:${JSON.stringify(request.query)}`
  const cached = await fastify.redis.get(cacheKey)
  if (cached) {
    reply.header('X-Cache', 'HIT')
    return JSON.parse(cached)
  }

  const data = await fetchCatalog(request.query)
  await fastify.redis.setex(cacheKey, 300, JSON.stringify(data))
  return data
})

Підтримка WebSocket

fastify.register(fastifyWs)

fastify.get('/ws/notifications', { websocket: true }, (socket, req) => {
  socket.on('message', (raw) => {
    const msg = JSON.parse(raw.toString())
  })

  const interval = setInterval(() => {
    if (socket.readyState === socket.OPEN) {
      socket.send(JSON.stringify({ type: 'ping' }))
    }
  }, 30000)

  socket.on('close', () => clearInterval(interval))
})

Метрики для Prometheus

fastify.register(fastifyMetrics, {
  endpoint: '/metrics',
  defaultMetrics: { enabled: true }
})

Структуроване логування через pino—найшвидший Node.js логгер.

Таймлайн розробки

Типовий REST API для сайту/веб-додатку на Fastify:

  • Проектування API (OpenAPI/Swagger)—3–5 днів: endpoint'и, схеми, аутентифікація
  • Базовий каркас: плагіни, роути, міграції—3–5 днів
  • Бізнес-логіка—залежить від складності; 1–2 тижні для CRUD-сайту, 3–6 тижнів для складного додатку
  • Інтеграції (платіж, email, зовнішні API)—1–3 тижні
  • Тести + документація—3–7 днів

Для простого корпоративного сайту з API (каталог, форми, кабінет)—повний цикл 4–8 тижнів. Fastify перевага: валідація й документація пишуться раз у схемі маршруту—економить час на обслуговуванні.