512просмотров
7.0%от подписчиков
23 марта 2026 г.
Score: 563
AsyncLocalStorage — прокидываем контекст запроса сквозь весь бэкенд без боли 🧩 В Node.js все запросы пользователей обрабатываются в одном потоке. Если тебе нужно прокинуть ID авторизованного пользователя или Trace-Id из контроллера глубоко в базу данных или логгер, тебе приходится тащить этот параметр через десятки функций. AsyncLocalStorage (из модуля async_hooks) решает эту проблему. Это аналог Thread-Local Storage из других языков — он позволяет хранить данные, привязанные к конкретной цепочке асинхронных вызовов. Шаг 1 — создаем хранилище:
Мы инициализируем хранилище и оборачиваем в него обработчик запроса. const { AsyncLocalStorage } = require('async_hooks');
const http = require('http'); const storage = new AsyncLocalStorage(); http.createServer((req, res) => { const traceId = req.headers['x-trace-id'] || 'uuid-12345'; // Все функции внутри run() будут иметь доступ к этому traceId storage.run({ traceId }, () => { handleRequest(req, res); });
}).listen(3000); function handleRequest(req, res) { // Вызываем глубокую функцию, параметры не передаем! deepNestedLog(); res.end('Ok');
} function deepNestedLog() { const store = storage.getStore(); console.log([${store.traceId}] Лог из глубины приложения!);
}
Зачем это нужно? 🚀 — Чистая архитектура: Твои сервисы и репозитории не забиты служебными параметрами вроде req или userId. 🧼
— Сквозное логирование: Логгер в любой строчке кода знает, в рамках какого HTTP-запроса он сейчас выполняется.
— Транзакции БД: Можно запустить транзакцию на уровне контроллера и автоматически использовать её во всех вложенных вызовах к базе данных. Методы-инструменты: 📝 — storage.run(store, callback) — запускает контекст. Всё, что внутри колбэка (и все асинхронные вызовы из него), получит доступ к store.
— storage.getStore() — возвращает текущие данные контекста. Если вызывать вне контекста — вернет undefined. 🔍
— storage.enterWith(store) — экспериментальный метод, который меняет контекст для текущего и всех последующих вызовов (использовать осторожно!). > Важный нюанс: AsyncLocalStorage работает быстро, но всё же добавляет небольшие накладные расходы на создание асинхронных ресурсов. Не стоит пихать туда гигабайты данных — храни только метаданные (ID сессии, язык, ID пользователя). ✅ ⚙ Backend Ready | #уроки