AsyncLocalStorage
Globální proměnné jsou občas užitečné/umí usnadnit práci. Problém s globálními proměnnými 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 třeba 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á dlouhodbbý proces jako je Node.js).
Existuje řešení v podobě AsyncLocalStorage třídy z modulu async_hooks .
Async hooks | Node.js v19.8.1 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á 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 funce addNumberToStore a logNumberFromStore přistupují ke “globálnímu” objektu, ale mezi requesty 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 callbacích, setTimeoutech, asynchronních funkcích atd atd. Node.js napozadí 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 requestu a to využít následně při logování pro identifikaci requestu.
- Globální proměnné, unikátní pro jednotlivé requesty.
