Уявіть: ваш мобільний додаток набирає 100 000 користувачів, але сервер починає гальмувати — таймаути, втрата даних, відкладені push-сповіщення. Щоб цього уникнути, потрібен грамотно спроектований backend на Node.js. Node.js + TypeScript — прагматичний вибір: швидкий старт, JSON-нативність, величезна екосистема. Ми використовуємо найкращі практики: Fastify, Prisma, JWT з ротацією та автоматичне CI/CD. У цій статті розберемо стек, архітектуру та типові помилки, а також покажемо, як уникнути проблем із продуктивністю та безпекою. На основі 40+ проєктів ми вивели оптимальну конфігурацію, яка витримує пікові навантаження без збоїв.
Чому Node.js для бекенду мобільного додатку?
Node.js обробляє до 20 000 запитів на секунду на одному ядрі завдяки event-loop. Для мобільних проєктів критичні низька затримка та підтримка realtime-функцій: чатів, лайків, сповіщень. Fastify — наш вибір для нових проєктів: він на 20–30% швидший за Express, має вбудовану валідацію через JSON Schema та нативну підтримку TypeScript. Нижче приклад ендпоінта:
// Fastify + TypeScript + Zod валідація import Fastify from 'fastify'; import { z } from 'zod'; const app = Fastify({ logger: true }); const CreatePostSchema = z.object({ title: z.string().min(1).max(200), content: z.string().min(1), authorId: z.string().uuid(), }); app.post('/posts', async (request, reply) => { const body = CreatePostSchema.parse(request.body); const post = await postService.create(body); return reply.status(201).send(post); }); База даних — PostgreSQL з Prisma ORM. Prisma генерує типобезпечний клієнт і спрощує міграції. Ось як виглядає запит із включенням пов'язаних сутностей:
const user = await prisma.user.findUnique({ where: { id: userId }, include: { posts: { take: 10, orderBy: { createdAt: 'desc' } } }, }); Порівняємо Fastify та Express у мобільних API:
| Критерій | Fastify | Express |
|---|---|---|
| Продуктивність (req/s) | 30% вище | Базовий |
| Вбудована валідація | JSON Schema | Відсутня |
| Типізація | Нативна TypeScript | Через middleware |
| Екосистема | Менше плагінів | Величезна |
Згідно з RFC 7519, JWT забезпечує цілісність токенів. Fastify швидший за Express у 1.3 рази (на 30%), що доведено бенчмарками.
Як реалізувати аутентифікацію мобільних клієнтів?
Для мобільних додатків ми використовуємо JWT з коротким access token (15 хвилин) та довгим refresh token (30 днів). Refresh token зберігається в таблиці refresh_tokens — це дозволяє інвалідувати всі сесії при зміні пароля. Згідно зі специфікацією JWT (RFC 7519), токени підписуються для забезпечення цілісності. Такий підхід знижує ризик компрометації та відповідає App Store Review Guidelines (Section 5.1).
Кроки по впровадженню:
- Генерація пари токенів при вході.
- Зберігання refresh token в БД.
- Middleware для верифікації access token.
- Endpoint для оновлення токенів.
- Ротація refresh token при кожному оновленні.
import jwt from 'jsonwebtoken'; export const generateTokens = (userId: string) => ({ accessToken: jwt.sign({ sub: userId, type: 'access' }, process.env.JWT_SECRET!, { expiresIn: '15m', }), refreshToken: jwt.sign({ sub: userId, type: 'refresh' }, process.env.JWT_REFRESH_SECRET!, { expiresIn: '30d', }), }); // Middleware верифікації export const authMiddleware = async (request: FastifyRequest, reply: FastifyReply) => { const token = request.headers.authorization?.replace('Bearer ', ''); if (!token) return reply.status(401).send({ error: 'Unauthorized' }); try { const payload = jwt.verify(token, process.env.JWT_SECRET!) as JwtPayload; request.userId = payload.sub!; } catch { return reply.status(401).send({ error: 'Invalid token' }); } }; Push-сповіщення та realtime: як уникнути проблем?
Push-сповіщення налаштовуємо через Firebase Admin SDK. Для масових розсилок використовуємо sendEachForMulticast пакетами по 500 токенів, невалідні видаляємо. Realtime-функції (чат, лайки) реалізуємо через WebSocket (ws або socket.io). Для горизонтального масштабування піднімаємо Redis Pub/Sub. Це дозволяє обробляти до 50 000 одночасних підключень на одному сервері. Зв'яжіться з нами, якщо потрібна детальна консультація по вашому сценарію.
import * as admin from 'firebase-admin'; admin.initializeApp({ credential: admin.credential.cert(serviceAccount) }); export const sendPushNotification = async ( fcmToken: string, title: string, body: string, data?: Record<string, string> ) => { const message: admin.messaging.Message = { token: fcmToken, notification: { title, body }, data, apns: { payload: { aps: { sound: 'default', badge: 1 } }, }, android: { priority: 'high', notification: { sound: 'default' }, }, }; return admin.messaging().send(message); }; import { WebSocketServer } from 'ws'; const wss = new WebSocketServer({ server: httpServer }); const connections = new Map<string, WebSocket>(); wss.on('connection', (ws, request) => { const userId = getUserIdFromRequest(request); connections.set(userId, ws); ws.on('close', () => connections.delete(userId)); }); export const notifyUser = (userId: string, event: object) => { const ws = connections.get(userId); if (ws?.readyState === WebSocket.OPEN) { ws.send(JSON.stringify(event)); } }; Чому Fastify краще Express для мобільних API?
Fastify дає приріст продуктивності до 30% за рахунок оптимізованого маршрутизатора та асинхронного парсингу. JSON Schema валідація — безкоштовно, без валідаторів. Для мобільних проєктів це означає швидші відповіді та менше витрат на серверні ресурси. З Express ви отримаєте більшу екосистему, але більше ручної роботи з валідацією та типізацією. Fastify — вибір для тих, хто цінує швидкість і надійність. Замовте розробку бекенду — ми підберемо стек під ваші задачі.
Типові помилки при розробці Node.js бекенду
- Блокуючі операції в event loop: JSON.parse великих даних, синхронний fs. Використовуйте worker threads або черги.
- N+1 у Prisma: без include кожен запит породжує окремі запити. Завжди використовуйте include або
$queryRaw. - Відсутність rate limiting: мобільний клієнт може генерувати лавину запитів. Fastify Rate Limit з Redis вирішує проблему.
| Компонент | Технологія | Альтернативи |
|---|---|---|
| Web framework | Fastify | Express, Koa |
| ORM | Prisma | TypeORM, Sequelize |
| Auth | JWT (access+refresh) | OAuth2, Firebase Auth |
| Push | Firebase Admin | APNs (iOS only) |
| Realtime | WebSocket (ws) | Socket.io, SSE |
| Queue | BullMQ (Redis) | RabbitMQ, AWS SQS |
| CI/CD | GitHub Actions | GitLab CI, CircleCI |
Процес розробки бекенду: покрокова інструкція
- Аналітика: визначаємо вимоги, навантаження, узгоджуємо контракт API (OpenAPI).
- Проектування: архітектура, вибір стеку, налаштування інфраструктури.
- Реалізація: пишемо код, налаштовуємо CI/CD, покриваємо тестами (unit + integration).
- Тестування: навантажувальне тестування, перевірка безпеки.
- Деплой: розгортання на production, моніторинг та алерти.
Строки: MVP бекенд (Auth + 3-5 ресурсів + push) — 2–3 тижні. Повноцінний бекенд з realtime та платежами — 1–3 місяці. Вартість MVP — від $3000, повний проєкт — від $15000. Ви можете заощадити до 30% бюджету за рахунок оптимізованої архітектури.
Що входить в роботу
При замовленні бекенду «під ключ» ми надаємо:
- Детальну технічну документацію (OpenAPI, архітектурна схема);
- Налаштований CI/CD (GitHub Actions) з автоматичним деплоєм;
- Доступи до репозиторію, сервера та адмінпанелі;
- Навчання вашої команди роботі з API (2 години);
- Технічну підтримку протягом 3 місяців після запуску.
Ми гарантуємо якість: сертифіковані Node.js розробники з досвідом 10+ років та 40+ успішних проєктів. Наша компанія на ринку вже 5 років.
Готові оцінити ваш проєкт? Пишіть нам для безкоштовної консультації. Отримайте детальний план розробки та точну оцінку строків.







