简介
cls-tls 是一个用于实现 Node.js 线程安全并且不依赖于 domain 模块的 npm 包。
该包依赖于 Node.js 的新特性:AsyncLocalStorage。AsyncLocalStorage 是 Node.js v12 中引入的封装了已弃用的 AsyncHooks API 的新 API。AsyncLocalStorage 提供了一种简单的机制,用于在异步任务(例如事件回调或 promise)之间共享数据,而不需要与执行上下文之间的任何关联。
通过 cls-tls,我们可以轻松地将上下文数据与异步函数以及其之间的链式调用共享。
安装
在项目根目录下使用 npm 安装 cls-tls:
npm install cls-tls
使用
当我们在异步任务中使用 cls-tls 属性时,我们需要创建一个 AsyncLocalStorage 对象。
在使用 AsyncLocalStorage 之前,您需要先调用以下代码,以便为每个异步任务创建自己的 AsyncLocalStorage 对象。
const cls = require('cls-tls'); const session = cls.createNamespace('your-session');
接下来,我们可以在异步函数中设置和获取自定义上下文。例如:
-- -------------------- ---- ------- -- --- ------- -- - -------- ----- -------- ----- - ------------------- - ------ ----- -- -- -------- --- - -- --- ------- -- ------- -------- ----- -------- ----- - ----- ------ - -------------------- -------------------------- -- ----- -- -- -------- -
这里我们定义了一个命名空间叫做“your-session”。这个命名空间中有一个键值对 { data: { value: 'this is my context' } }。你可以把这个 data 对象看作是上下文。
当我们在异步任务中调用 session.set 函数时,我们实际上是将一个 key-value 对存储到当前命名空间的存储中。当我们在另一个异步任务中调用 session.get 函数时,我们实际上是从当前命名空间的存储中获取一个 value,根据 key。
这种方式使我们能够轻松地共享我们的上下文数据。
示例
以下是一个示例,演示了如何使用 cls-tls 共享上下文:
-- -------------------- ---- ------- ----- --- - ------------------- ----- ------- - ------------------------------------ -------- --------- - ----- ---- - -------------------- ------------------------- ---------- - ----- -------- ------- - --- - ------------------- - --- - --- --------- - ---------- ----- -------- -- -------- ----- --- ----- ---- --------- - ----------- - ----- --- - --------- - ------- --------------- - - ----- -------- ------- - --- - ------------------- - --- - --- --------- - ---------- ----- -------- -- -------- ----- --- ----- ---- --------- - ----------- - ----- --- - --------- - ------- --------------- - - ----- -------- ------- - --- - ------------------- - --- - --- --------- - ---------- ----- --- ----------------- -- ------------------- ------- --------- - ----------- - ----- --- - --------- - ------- --------------- - - ------ -- -- - --- - ------------------- - --- - --- ---------------- ---------- ----- -------- -- -------- ----- --- ----- ---- ---------------- ----------- - ----- --- - ---------------- ------- --------------- - -----
运行这个脚本,你会看到以下输出:
-- -------------------- ---- ------- - ---- ---------- --- ----------- ------- --- ---- - ------- --- ---- - ------- --- ---- - ------- --- ---- - -------- --- ---- - -------- --- ---- - -------- --- ----------- --------
在这个例子中,我们为每个任务设置了自己的上下文对象(其中包含一个名为“id”的属性)。当任务 A 调用任务 B 时,任务 B 会在自己的上下文中设置一个新的 id 值。之后,任务 C 会按照同样的方式设置新的上下文,等待 3 秒钟,然后结束。
值得注意的是,我们使用了 await 关键字来等待异步函数返回,以确保每个任务都在自己的上下文中正确地设置和获取数据。
结论
cls-tls 是一个非常有用的 npm 包,用于实现 Node.js 线程安全并且不依赖于 domain 模块。它基于 AsyncLocalStorage 的新特性,使我们能够轻松地共享上下文数据,并在异步任务之间传递。这使得 Node.js 应用程序的编写更加容易,而且代码更加清晰易读。
我们希望这篇文章能够帮助您使用 cls-tls,并为您的 Node.js 应用程序的编写提供一些指导和帮助。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/60056cf481e8991b448e6a6c