Проверяет понимание механизма AsyncLocalStorage в Node.js для передачи контекста через асинхронные вызовы без явной передачи параметров.
AsyncLocalStorage — это класс из модуля async_hooks, который позволяет сохранять данные, привязанные к конкретному асинхронному контексту выполнения. В отличие от глобальных переменных, значения изолированы между разными запросами или задачами, даже если они выполняются параллельно в одном процессе.
Когда вы вызываете als.run(store, callback), Node.js создаёт новый асинхронный контекст. Все асинхронные операции, запущенные внутри callback (промисы, setTimeout, I/O), наследуют этот store. Метод als.getStore() возвращает текущее значение в любом месте этой цепочки.
const { AsyncLocalStorage } = require('async_hooks');
const als = new AsyncLocalStorage();
function log(msg) {
const store = als.getStore();
console.log(`[${store?.requestId}] ${msg}`);
}
async function handleRequest(req) {
als.run({ requestId: req.id }, async () => {
log('start');
await doWork();
log('end');
});
}
async function doWork() {
await new Promise(r => setTimeout(r, 10));
log('inside work'); // requestId доступен
}
Важно помнить: store не шарится между разными вызовами run(), а также не работает через нативные worker_threads без дополнительной настройки.
Итог: AsyncLocalStorage стоит применять, когда нужно неявно передавать контекст через асинхронные вызовы — это упрощает код логирования, трейсинга и управления запросами в серверных приложениях.