С какими паттернами проектирования вы работали в Node.js?

«С какими паттернами проектирования вы работали в Node.js?» — вопрос из категории Паттерны, который задают на 26% собеседований Node.js Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В Node.js-проектах я активно применял следующие паттерны:

  1. Middleware / Цепочка обязанностей (Chain of Responsibility): Фундаментальный паттерн в Express/Koa для обработки запросов.

    // Кастомный middleware для логирования и проверки прав
    const logger = (req, res, next) => {
        console.log(`${req.method} ${req.url}`);
        next();
    };
    app.use(logger);
  2. Singleton (Одиночка): Для управления единственным подключением к базе данных или кэшу.

    // db.js - Singleton для подключения к Redis
    const Redis = require('ioredis');
    class RedisConnection {
        constructor() {
            if (!RedisConnection.instance) {
                RedisConnection.instance = new Redis(process.env.REDIS_URL);
            }
        }
        getInstance() {
            return RedisConnection.instance;
        }
    }
    module.exports = new RedisConnection();
  3. Observer / EventEmitter: Встроенная в Node.js событийная модель, которую я использовал для декомпозиции логики (например, отправка email после регистрации).

    const EventEmitter = require('events');
    const orderEmitter = new EventEmitter();
    orderEmitter.on('order.created', (orderData) => {
        // Отправка уведомления, обновление инвентаря
        sendEmail(orderData.userEmail);
    });
  4. Repository (Репозиторий): Для абстрагирования слоя доступа к данным, что упрощает тестирование и смену БД.

    // userRepository.js
    class UserRepository {
        constructor(db) { this.db = db; }
        async findById(id) {
            return this.db.user.findUnique({ where: { id } });
        }
    }
  5. Factory (Фабрика): Для создания сложных объектов, например, различных типов валидаторов или клиентов для внешних API (Stripe, SendGrid).

  6. Dependency Injection (Внедрение зависимостей): Часто применяю в связке с Repository паттерном для написания модульных и тестируемых сервисов.