{"componentChunkName":"component---src-gatsby-theme-chronoblog-templates-note-js","path":"/notes/async-local-storage-nodejs/","result":{"data":{"mdx":{"parent":{"__typename":"File","fields":{"gitLogLatestDate":"2026-06-28 22:30:40 +0200"}},"id":"f3d8234d-3dc1-59de-93ee-c24e3a6783f6","excerpt":"In Express and NestJS apps you often need a  requestId ,  userId , or trace fields deep in services and loggers without threading a context…","frontmatter":{"title":"Request context in Node.js with AsyncLocalStorage","date":"2026-06-28 00:01:00 UTC","job_ad":null,"job_ad_id":null,"job_ad_url":null,"tags":["node","express","nestjs","async-local-storage","logging"],"cover":{"childImageSharp":{"fluid":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAAAPoAAAD6AG1e1JrAAAAuElEQVQoz61R7YoDMQjM+79pk93uNuRDT5MpurQ/joPmoMIwijKOGOac+ASLF3+KsCZovCYaVrauLH0h9K5QmWBS9C4gumpjsp6unfp2GG8dvSmOOyHeKvaNvDbeEqE1Rc6M/BDUomAenud8gWmgFMXjFDBPE2wwl+fJiLHiuLM7c8HtWrbvDSlWn+lNsKWGlKr3WxOcx2WG+kAwdfkZLlqKuCORgVrVYfm/Tv76U9aH8Sv/GwFfjidyHBXVqa6RMgAAAABJRU5ErkJggg==","aspectRatio":2.0869565217391304,"src":"/static/936f571de2c4c15a37512a9054153c26/c4ecb/cover.png","srcSet":"/static/936f571de2c4c15a37512a9054153c26/57ab0/cover.png 192w,\n/static/936f571de2c4c15a37512a9054153c26/f4739/cover.png 384w,\n/static/936f571de2c4c15a37512a9054153c26/c4ecb/cover.png 768w","srcWebp":"/static/936f571de2c4c15a37512a9054153c26/dd090/cover.webp","srcSetWebp":"/static/936f571de2c4c15a37512a9054153c26/ae504/cover.webp 192w,\n/static/936f571de2c4c15a37512a9054153c26/fef30/cover.webp 384w,\n/static/936f571de2c4c15a37512a9054153c26/dd090/cover.webp 768w","sizes":"(max-width: 768px) 100vw, 768px","presentationWidth":768,"presentationHeight":366},"resize":{"src":"/static/936f571de2c4c15a37512a9054153c26/c4ecb/cover.png"}}}},"fields":{"slug":"/notes/async-local-storage-nodejs/","readingTime":{"text":"6 min read"}},"body":"function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\n/* @jsxRuntime classic */\n\n/* @jsx mdx */\nvar _frontmatter = {\n  \"title\": \"Request context in Node.js with AsyncLocalStorage\",\n  \"date\": \"2026-06-28 00:01:00 UTC\",\n  \"cover\": \"./cover.png\",\n  \"tags\": [\"node\", \"express\", \"nestjs\", \"async-local-storage\", \"logging\"],\n  \"canonical_url\": \"https://sevic.dev/notes/async-local-storage-nodejs/\"\n};\nvar layoutProps = {\n  _frontmatter: _frontmatter\n};\nvar MDXLayout = \"wrapper\";\nreturn function MDXContent(_ref) {\n  var components = _ref.components,\n      props = _objectWithoutProperties(_ref, [\"components\"]);\n\n  return mdx(MDXLayout, _extends({}, layoutProps, props, {\n    components: components,\n    mdxType: \"MDXLayout\"\n  }), mdx(\"p\", null, \"In Express and NestJS apps you often need a \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"requestId\"), \", \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"userId\"), \", or trace fields deep in services and loggers without threading a context object through every function. A module-level global breaks under concurrent requests; passing \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"ctx\"), \" through every layer is noisy.\"), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"AsyncLocalStorage\"), \" (built into \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"node:async_hooks\"), \") gives each async execution chain its own store. Concurrent requests stay isolated, and \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"await\"), \", timers, and Promise chains inside a request inherit the same context automatically.\"), mdx(\"p\", null, \"This post covers the API, an Express middleware pattern, a NestJS interceptor with parameter decorators, and common pitfalls.\"), mdx(\"h3\", {\n    \"id\": \"what-asynclocalstorage-is\"\n  }, \"What AsyncLocalStorage is\"), mdx(\"p\", null, mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"AsyncLocalStorage\"), \" has been stable since Node.js 16.4. No npm package is required.\"), mdx(\"table\", null, mdx(\"thead\", {\n    parentName: \"table\"\n  }, mdx(\"tr\", {\n    parentName: \"thead\"\n  }, mdx(\"th\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": null\n  }), \"Approach\"), mdx(\"th\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": null\n  }), \"Concurrent requests\"), mdx(\"th\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": null\n  }), \"Propagates through \", mdx(\"inlineCode\", {\n    parentName: \"th\"\n  }, \"await\")))), mdx(\"tbody\", {\n    parentName: \"table\"\n  }, mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": null\n  }), \"Global variable\"), mdx(\"td\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": null\n  }), \"Breaks\"), mdx(\"td\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": null\n  }), \"Yes\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": null\n  }), \"Pass \", mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"ctx\"), \" argument\"), mdx(\"td\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": null\n  }), \"Safe\"), mdx(\"td\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": null\n  }), \"Manual at every layer\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": null\n  }), mdx(\"strong\", {\n    parentName: \"td\"\n  }, \"AsyncLocalStorage\")), mdx(\"td\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": null\n  }), \"Safe\"), mdx(\"td\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": null\n  }), \"Automatic\")))), mdx(\"h3\", {\n    \"id\": \"prerequisites\"\n  }, \"Prerequisites\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Node.js version 26\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"npm i express\"))), mdx(\"h3\", {\n    \"id\": \"core-api\"\n  }, \"Core API\"), mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-js\"\n  }), \"import { AsyncLocalStorage } from 'node:async_hooks';\\n\\nconst als = new AsyncLocalStorage();\\n\\n// Start a context for this async chain\\nals.run({ requestId: 'abc' }, () => {\\n  doWork();\\n});\\n\\n// Read the current store anywhere in the chain\\nconst store = als.getStore();\\n\")), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"strong\"\n  }, \"als.run(store, callback)\")), \" - preferred entry point; call once per request in middleware.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"strong\"\n  }, \"als.getStore()\")), \" - returns the store for the current async chain, or \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"undefined\"), \" outside \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"run()\"), \".\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"strong\"\n  }, \"als.enterWith(store)\")), \" - sets context for the current execution resource; useful in some framework hooks, but \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"run()\"), \" is the default pattern for Express middleware.\")), mdx(\"h3\", {\n    \"id\": \"express-middleware-pattern\"\n  }, \"Express middleware pattern\"), mdx(\"p\", null, \"Create a store per request in middleware, then read it from loggers and services without passing arguments.\"), mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-js\"\n  }), \"// context.js\\nimport { AsyncLocalStorage } from 'node:async_hooks';\\n\\nexport const requestContext = new AsyncLocalStorage();\\n\\nexport function getRequestId() {\\n  return requestContext.getStore()?.requestId;\\n}\\n\")), mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-js\"\n  }), \"// logger.js\\nimport { getRequestId } from './context.js';\\n\\nexport function log(level, message, extra = {}) {\\n  console.log(\\n    JSON.stringify({\\n      level,\\n      requestId: getRequestId(),\\n      message,\\n      ...extra,\\n    })\\n  );\\n}\\n\")), mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-js\"\n  }), \"// middleware.js\\nimport { randomUUID } from 'node:crypto';\\nimport { requestContext } from './context.js';\\n\\nexport function requestContextMiddleware(req, res, next) {\\n  const store = {\\n    requestId: req.headers['x-request-id'] ?? randomUUID(),\\n  };\\n  res.setHeader('x-request-id', store.requestId);\\n  requestContext.run(store, () => next());\\n}\\n\")), mdx(\"p\", null, \"Wire middleware before routes. A handler can \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"await\"), \" a simulated database call and log without receiving \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"requestId\"), \":\"), mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-js\"\n  }), \"// routes.js\\nimport { log } from './logger.js';\\n\\nfunction delay(ms) {\\n  return new Promise((resolve) => setTimeout(resolve, ms));\\n}\\n\\nasync function findUserById(id) {\\n  await delay(100);\\n  log('info', 'Loaded user from database', { userId: id });\\n  return { id, name: `User ${id}` };\\n}\\n\\nexport async function getUser(req, res) {\\n  const user = await findUserById(req.params.id);\\n  res.json(user);\\n}\\n\")), mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-js\"\n  }), \"// app.js\\nimport express from 'express';\\nimport { requestContextMiddleware } from './middleware.js';\\nimport { getUser } from './routes.js';\\nimport { getRequestId } from './context.js';\\n\\nconst app = express();\\n\\napp.use(requestContextMiddleware);\\napp.get('/users/:id', getUser);\\n\\napp.listen(3000, () => {\\n  console.log('Listening on http://localhost:3000');\\n});\\n\")), mdx(\"p\", null, \"Send concurrent requests with different \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"x-request-id\"), \" headers. Logs interleave on stdout, but each line carries the correct \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"requestId\"), \" for its request.\"), mdx(\"h3\", {\n    \"id\": \"nestjs-interceptor-and-decorator\"\n  }, \"NestJS interceptor and decorator\"), mdx(\"p\", null, \"The flow is the same as Express - an interceptor replaces middleware. For production apps, \", mdx(\"a\", _extends({\n    parentName: \"p\"\n  }, {\n    \"href\": \"https://github.com/Papooch/nestjs-cls\"\n  }), mdx(\"inlineCode\", {\n    parentName: \"a\"\n  }, \"nestjs-cls\")), \" wraps \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"AsyncLocalStorage\"), \" with typed stores and plugins; the snippets below use the built-in API directly.\"), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Prerequisites add-on:\"), \" \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"npm i @nestjs/common @nestjs/core @nestjs/platform-express reflect-metadata rxjs\")), mdx(\"p\", null, \"Shared store:\"), mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-ts\"\n  }), \"// request-context.storage.ts\\nimport { AsyncLocalStorage } from 'node:async_hooks';\\n\\nexport type RequestContextStore = { requestId: string };\\n\\nexport const requestContext = new AsyncLocalStorage<RequestContextStore>();\\n\")), mdx(\"p\", null, \"Wrap each request in \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"als.run()\"), \" with a global interceptor. Subscribe inside \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"run()\"), \" so context propagates through async route handlers:\"), mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-ts\"\n  }), \"// request-context.interceptor.ts\\nimport {\\n  CallHandler,\\n  ExecutionContext,\\n  Injectable,\\n  NestInterceptor,\\n} from '@nestjs/common';\\nimport { randomUUID } from 'node:crypto';\\nimport { Observable } from 'rxjs';\\nimport { requestContext, RequestContextStore } from './request-context.storage';\\n\\n@Injectable()\\nexport class RequestContextInterceptor implements NestInterceptor {\\n  intercept(context: ExecutionContext, next: CallHandler): Observable<unknown> {\\n    const req = context.switchToHttp().getRequest();\\n    const store: RequestContextStore = {\\n      requestId: (req.headers['x-request-id'] as string) ?? randomUUID(),\\n    };\\n    const res = context.switchToHttp().getResponse();\\n    res.setHeader('x-request-id', store.requestId);\\n\\n    return new Observable((subscriber) => {\\n      requestContext.run(store, () => {\\n        next.handle().subscribe(subscriber);\\n      });\\n    });\\n  }\\n}\\n\")), mdx(\"p\", null, \"Parameter decorators read from the store in controllers:\"), mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-ts\"\n  }), \"// request-context.decorator.ts\\nimport { createParamDecorator, ExecutionContext } from '@nestjs/common';\\nimport { requestContext, RequestContextStore } from './request-context.storage';\\n\\nexport const RequestContext = createParamDecorator(\\n  (_data: unknown, _ctx: ExecutionContext): RequestContextStore | undefined =>\\n    requestContext.getStore(),\\n);\\n\\nexport const RequestId = createParamDecorator(\\n  (): string | undefined => requestContext.getStore()?.requestId,\\n);\\n\")), mdx(\"p\", null, \"Register the interceptor globally and use \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"@RequestId()\"), \" in a controller. Services can call \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"requestContext.getStore()\"), \" directly (for example from an injectable logger):\"), mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-ts\"\n  }), \"// app.module.ts\\nimport { Module } from '@nestjs/common';\\nimport { APP_INTERCEPTOR } from '@nestjs/core';\\nimport { RequestContextInterceptor } from './request-context/request-context.interceptor';\\nimport { UsersModule } from './users/users.module';\\n\\n@Module({\\n  imports: [UsersModule],\\n  providers: [{ provide: APP_INTERCEPTOR, useClass: RequestContextInterceptor }],\\n})\\nexport class AppModule {}\\n\")), mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-ts\"\n  }), \"// users.controller.ts\\n@Get(':id')\\nasync getUser(@Param('id') id: string, @RequestId() requestId: string) {\\n  const user = await this.usersService.findById(id);\\n  return { requestId, user };\\n}\\n\")), mdx(\"p\", null, mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"@Transactional()\"), \" from \", mdx(\"a\", _extends({\n    parentName: \"p\"\n  }, {\n    \"href\": \"https://github.com/Aliheym/typeorm-transactional\"\n  }), \"typeorm-transactional\"), \" uses the same ALS propagation idea for database transactions. See \", mdx(\"a\", _extends({\n    parentName: \"p\"\n  }, {\n    \"href\": \"https://sevic.dev/notes/typeorm-nestjs-examples/\"\n  }), \"TypeORM examples with NestJS\"), \" for a real-world decorator built on top of request-scoped context.\"), mdx(\"h3\", {\n    \"id\": \"why-it-works\"\n  }, \"Why it works\"), mdx(\"p\", null, \"Node ties the store to the async resource created when \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"als.run()\"), \" executes. Any async work started inside that callback - including \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"await\"), \", \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"setTimeout\"), \", and nested Promise chains - runs in the same context. Each concurrent request calls \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"als.run()\"), \" with its own store, so \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"getStore()\"), \" always returns the value for the current chain.\"), mdx(\"h3\", {\n    \"id\": \"common-pitfalls\"\n  }, \"Common pitfalls\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Call \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"als.run()\"), \" at the \", mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"request boundary\"), \" (middleware), not inside a shared singleton constructor.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"strong\"\n  }, \"getStore()\"), \" returns \", mdx(\"inlineCode\", {\n    parentName: \"strong\"\n  }, \"undefined\")), \" outside \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"run()\"), \" - guard with optional chaining or a default.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Callbacks scheduled \", mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"before\"), \" \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"run()\"), \" or from another request will not see your store.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Worker threads\"), \" and \", mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"cluster\"), \" workers each have separate \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"AsyncLocalStorage\"), \" instances.\")), mdx(\"h3\", {\n    \"id\": \"related-use-cases\"\n  }, \"Related use cases\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Structured logging\"), \" - attach \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"requestId\"), \" to every log line (this post).\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Distributed tracing\"), \" - OpenTelemetry uses \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"AsyncLocalStorage\"), \" internally; see \", mdx(\"a\", _extends({\n    parentName: \"li\"\n  }, {\n    \"href\": \"https://sevic.dev/notes/opentelemetry-tracing/\"\n  }), \"Tracing Node.js Microservices with OpenTelemetry\"), \".\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Database transactions\"), \" - \", mdx(\"a\", _extends({\n    parentName: \"li\"\n  }, {\n    \"href\": \"https://github.com/Aliheym/typeorm-transactional\"\n  }), \"typeorm-transactional\"), \" propagates transactions across repositories via ALS; see \", mdx(\"a\", _extends({\n    parentName: \"li\"\n  }, {\n    \"href\": \"https://sevic.dev/notes/typeorm-nestjs-examples/\"\n  }), \"TypeORM examples with NestJS\"), \".\")), mdx(\"h3\", {\n    \"id\": \"demo\"\n  }, \"Demo\"), mdx(\"p\", null, \"Runnable code for this post:\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Express\"), \" - \", mdx(\"a\", _extends({\n    parentName: \"li\"\n  }, {\n    \"href\": \"https://github.com/delimitertech/demos/tree/main/nodejs/async-local-storage-nodejs-demo\"\n  }), \"async-local-storage-nodejs-demo\")), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"NestJS\"), \" - \", mdx(\"a\", _extends({\n    parentName: \"li\"\n  }, {\n    \"href\": \"https://github.com/delimitertech/demos/tree/main/backend/async-local-storage-nestjs-demo\"\n  }), \"async-local-storage-nestjs-demo\"))), mdx(\"p\", null, \"Get access via \", mdx(\"a\", _extends({\n    parentName: \"p\"\n  }, {\n    \"href\": \"https://sevic.dev/demos\"\n  }), \"code demos\"), \".\"));\n}\n;\nMDXContent.isMDXComponent = true;"}},"pageContext":{"id":"f3d8234d-3dc1-59de-93ee-c24e3a6783f6"}},"staticQueryHashes":["1961101537","2542493696"]}