Node.js 中的 asyncLocalStorage.enterWith(store) 函数

2025年4月25日 | 阅读 4 分钟

Node.js 中的 asyncLocalStorage.enterWith(store) 函数使用提供的 store 对象为异步操作创建当前上下文。它允许您在不显式通过函数参数传递数据的情况下,跨 Promise、定时器和回调等异步任务维护共享状态。asyncLocalStorage.run().enterWith() 函数用于更新已存在的上下文,而不是创建一个新的上下文。它满足了多种用例,因为大多数 Web 服务器和应用程序会跟踪诸如特定请求元数据之类的状态,当许多异步进程使用相同的执行路径时。

目的

asyncLocalStorage.enterWith(store) 函数使用一个特定的 store(一个 JavaScript 对象)为异步操作设置当前上下文。之后,此 "store" 可以从任何后续的异步操作中访问,从而允许数据通过回调、Promise 和其他异步操作隐式传输。

关键点

  • 上下文设置:asyncLocalStorage.enterWith(store) 函数要求您使用给定的 store 对象设置上下文;它将是同一执行路径上所有后续异步操作使用的 store。
  • 与 asyncLocalStorage 不同,不创建新的执行上下文。run() 或 enterWith() 函数均不建立新上下文。相反,这些函数中的每一个都将获取当前上下文并将其存储在上下文中,该上下文可供此后的异步代码访问。
  • 在异步任务期间可用:AsyncLocalStorage 允许任何后续执行路径在使用 enterWith() 进入上下文后恢复该上下文。getStore(),确保即使在异步操作可以切换时,当前状态仍然可访问。

示例 1

让我们通过一个例子来说明 Node.js 中 asyncLocalStorage.enterWith(store) 函数的用法。

输出

 
Current store: { requestId: 12345 }   

用例

在另一种场景中,当您想要维护请求的状态时。Web 服务器用于跨多个异步事务提供有关用户会话的信息,例如请求 ID,例如执行 数据库 调用,然后执行 API 请求。这消除了在各个阶段手动传输数据的需要。

  • enterWith() 函数:它使得在不启动另一个新上下文的情况下启动一个新的活动上下文成为可能。
  • 为了运行一个函数,run() 函数会创建一个新的执行上下文并对其进行初始化。"store" 随后可用于后续的任何异步操作,这允许通过回调、Promise 和其他带有 store 的异步操作进行一种“隐形”的数据传输。

用途

  • 使用 asyncLocalStorage.enterWith(store) 函数在调用链的特定点指定或更改活动上下文。
  • 当您需要在不从头开始创建新上下文的情况下修改现有上下文时,它非常有用。这与使用现有的中间件或处理类似 Express 的框架中的请求状态没有什么太大区别。

示例 2

让我们再用一个例子来说明 Node.js 中 asyncLocalStorage.enterWith(store) 函数的用法。

输出

 
Server running at https://:3000/   

说明

  • 在这个例子中,我们为每个 HTTP 请求获取用户数据并生成一个新的 requestId。
  • 我们使用 asyncLocalStorage 使用此数据设置当前上下文。enterWith({ user, requestId})。
  • 之后,enterWith() 用于允许 logRequestInfo() 函数在 setTimeout 调用中等待异步执行,同时仍能从存储中获取用户 ID 和请求 ID。
  • 这样,请求特定数据就能在整个异步操作中得以维护。

结论

总之,Node.js 中的 AsyncLocalStorage.enterWith(store) 函数方法可能是一种非常有效的方式,供程序员在不显式地在函数调用之间传递数据的情况下,保持异步进程之间的共享状态。它使开发人员能够轻松管理特定于请求的数据,以及来自 Promise、回调和所有异步操作的数据。它在在线应用程序中特别有用,因为在线应用程序需要跟踪请求的生命周期,正如使用 HTTP 服务器的示例所示。上下文的设置和检索将为复杂的异步流程提供更快的代码管理、提高可读性和更好的可维护性。