AsyncLocalStorage
Globální proměnné jsou občas užitečné a umí usnadnit práci. Problém s nimi je, že Node.js proces často obsluhuje více uživatelů zároveň (HTTP server), tudíž globální proměnné jsou sdílené mezi uživateli a mohlo by tak dojít například k úniku citlivých informací nebo pomíchání dat mezi uživateli. V PHP tento problém není, jelikož PHP proces vždy obslouží jeden požadavek a končí, takže globální proměnné v PHP jsou vždy jen pro jednoho uživatele (pokud nepoužíváme asynchronní PHP knihovnu, která z PHP udělá dlouhodobý proces, jako je Node.js).
Existuje řešení v podobě třídy AsyncLocalStorage z modulu async_hooks.
Async hooks | Node.js Documentation
Tato třída nám umožní vytvořit „globální“ kontext, který je ale unikátní mezi HTTP požadavky.
Nejprve vytvoříme instanci třídy AsyncLocalStorage:
Tato instance má dvě hlavní metody: run a getStore. Metoda run bere dva parametry: prvním je store a druhým je callback. Volání getStore funguje pouze uvnitř metody run a vrací právě ten store zadaný v prvním parametru metody run.
Tento kód po spuštění vypíše:
Je tak vidět, že funkce addNumberToStore a logNumberFromStore přistupují ke „globálnímu“ objektu, ale mezi požadavky se navzájem neovlivňují. Zároveň nevadí await promisu mezi přístupy ke storu. Stejně tak by přístup ke storu fungoval uvnitř funkce libovolně zanořené v callbacku, setTimeoutech, asynchronních funkcích atd. Node.js na pozadí sleduje, kdo právě běžící kód „vlastní“, a tak z metody getStore vždy vrátí správný objekt.
Využití
- Do kontextu můžeme ukládat například ID aktuálního požadavku a to využít následně při logování pro identifikaci requestu.
- Globální proměnné unikátní pro jednotlivé požadavky.
