IT Academy
Справочник курса

Node.js backend

Все объяснения, задачи и лабораторная в одном месте.

Можно сохранить страницу в PDF через печать браузера. Для печати разборы ответов раскрываются автоматически.

1. Runtime Node.js и event loop

Объяснение

Event loop выполняет JavaScript callbacks; CPU-задача задерживает остальные запросы. Асинхронный ввод-вывод не делает синхронный парсер неблокирующим. Потоки workers полезны для тяжёлого вычисления при контролируемой очереди.

Задача для самостоятельного решения

Почему обработка огромного JSON тормозит весь сервис?

Показать разбор ответа

Разбор и вычисления занимают event loop. Ограничьте размер входа, измерьте задержку loop и при необходимости вынесите вычисление из основного потока.

2. Модули, TypeScript и конфигурация

Объяснение

Модули задают явные зависимости. TypeScript стирает типы, поэтому env и JSON требуют runtime-проверки. Приложение должно завершать запуск с понятной ошибкой при отсутствующей обязательной конфигурации.

Задача для самостоятельного решения

Что делать с PORT='abc'?

Показать разбор ответа

Проверить целое число и диапазон до запуска listener. Молчаливое приведение NaN или запасное значение скрывает неверное окружение.

3. HTTP framework и middleware

Объяснение

Middleware последовательно обрабатывает запрос. Ошибки async-handler нужно передавать установленному механизму framework. Отправка ответа не всегда прекращает дальнейший код функции.

Задача для самостоятельного решения

Почему после res.send часто нужен return?

Показать разбор ответа

Иначе код продолжится и может выполнить второй ответ или лишний побочный эффект. Структура ветвей должна гарантировать одно завершение запроса.

4. PostgreSQL, migrations и transactions

Объяснение

Пул соединений ограничивает одновременную работу с БД. Параметризованный SQL отделяет данные от синтаксиса. Транзакция должна использовать одно соединение до COMMIT или ROLLBACK.

Задача для самостоятельного решения

Можно ли выполнять BEGIN и UPDATE через случайные соединения пула?

Показать разбор ответа

Нет: они могут оказаться в разных сессиях. Получите client, выполните транзакцию на нём и освободите в finally.

5. Queues, workers и backpressure

Объяснение

Backpressure замедляет производителя, когда потребитель не успевает. Неограниченная очередь превращает всплеск нагрузки в исчерпание памяти. Повторяемая задача должна быть идемпотентной.

Задача для самостоятельного решения

Очередь получает 100 задач/с, исполняет 80. Как растёт backlog?

Показать разбор ответа

На 20 задач/с, то есть 1200 за минуту. Нужны ограничение входа, увеличение пропускной способности или отказ с понятной политикой повторов.

6. Тесты, security и observability

Объяснение

Наблюдаемость связывает request_id с ошибкой и длительностью. Проверка зависимостей не заменяет проверку бизнес-сценария. Graceful shutdown должен закрывать listener до соединений, необходимых текущим запросам.

Задача для самостоятельного решения

Как тестировать зависание внешнего API?

Показать разбор ответа

Подменить зависимость контролируемым timeout, проверить ограниченное время ответа, отсутствие утечки соединений и корректный ответ клиента.

Практика

Лабораторная работа

Подготовка

Node.js. Сохраните server.mjs и запустите node server.mjs; остановка Ctrl+C.

Учебный пример

import http from 'node:http';
const server = http.createServer((req,res) => {
  if (req.method !== 'GET' || req.url !== '/health') {
    res.writeHead(404); res.end(); return;
  }
  res.writeHead(200, {'content-type':'application/json'});
  res.end(JSON.stringify({status:'ok'}));
});
server.listen(3000, '127.0.0.1');
process.on('SIGTERM', () => server.close());

Как работает пример и что ожидать

GET http://127.0.0.1:3000/health возвращает JSON status=ok, другой маршрут — 404. Bind на loopback подходит для локального опыта. SIGTERM прекращает приём соединений; для production нужен предел ожидания и закрытие зависимостей.

Итоговая работа

Добавьте PostgreSQL, миграции и очередь с ограничением. Проверяйте размер тела, JSON и права. Напишите тест повторной фоновой задачи и нагрузочный сценарий, фиксирующий задержку event loop.

Проверка результата

1. Опишите исходные данные и условия запуска, чтобы другой человек мог повторить работу.
2. Приложите результат обычного сценария и сравните его с ожидаемым.
3. Проверьте неверный вход, граничный случай и отказ зависимости, если она есть.
4. Объясните выбранное решение и известное ограничение.
5. Сохраните исправления после самопроверки вместе с примером, который раньше не работал.

Как оценить работу

По каждому пункту поставьте 0 (не выполнено), 1 (выполнено с пробелами) или 2 (результат воспроизводим и объяснён). Если обязательный сценарий не работает, вернитесь к нему независимо от общей суммы. Это рубрика самопроверки: сайт не исполняет присланный код и не выдаёт автоматическую оценку проекта.