Ответ
В Node.js-проектах я активно применял следующие паттерны:
-
Middleware / Цепочка обязанностей (Chain of Responsibility): Фундаментальный паттерн в Express/Koa для обработки запросов.
// Кастомный middleware для логирования и проверки прав const logger = (req, res, next) => { console.log(`${req.method} ${req.url}`); next(); }; app.use(logger); -
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(); -
Observer / EventEmitter: Встроенная в Node.js событийная модель, которую я использовал для декомпозиции логики (например, отправка email после регистрации).
const EventEmitter = require('events'); const orderEmitter = new EventEmitter(); orderEmitter.on('order.created', (orderData) => { // Отправка уведомления, обновление инвентаря sendEmail(orderData.userEmail); }); -
Repository (Репозиторий): Для абстрагирования слоя доступа к данным, что упрощает тестирование и смену БД.
// userRepository.js class UserRepository { constructor(db) { this.db = db; } async findById(id) { return this.db.user.findUnique({ where: { id } }); } } -
Factory (Фабрика): Для создания сложных объектов, например, различных типов валидаторов или клиентов для внешних API (Stripe, SendGrid).
-
Dependency Injection (Внедрение зависимостей): Часто применяю в связке с Repository паттерном для написания модульных и тестируемых сервисов.