B
Backend Ready | IT
@backend_ready7.3K подп.
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 | #уроки
512
просмотров
2360
символов
Да
эмодзи
Нет
медиа

Другие посты @backend_ready

Все посты канала →
AsyncLocalStorage — прокидываем контекст запроса сквозь весь — @backend_ready | PostSniper