什么是 cls-hooked?
cls-hooked 是一个 Node.js 的 NPM 包,用于在异步调用链上分配和传递作用域的数据。它基于 Continuation Local Storage(CLS)模式实现,提供了一种简单的方式来跨越异步边界共享上下文。
使用 cls-hooked,我们可以在 HTTP 请求处理、数据库查询等多个异步操作中保存上下文信息,方便后续使用。
如何使用 cls-hooked?
安装 cls-hooked
在你的 Node.js 项目中,运行以下命令:
npm install cls-hooked --save
引入并创建 CLS 实例
在你的代码中,引入 cls-hooked 并创建 CLS 实例,如下所示:
const cls = require('cls-hooked'); const namespace = cls.createNamespace('my-namespace');
注意,
my-namespace
可以替换为你想要的任意名称。将需要共享上下文的代码封装在 run 函数中
在需要共享上下文的异步代码块中,将其封装在
namespace.run()
函数中:namespace.run(() => { // 在此处访问共享的上下文变量 console.log(namespace.get('key')); // 执行异步函数 someAsyncFunction(); });
在链路中传递上下文
在异步操作中,可以通过
namespace.set()
和namespace.get()
方法来存储和访问共享的上下文变量。例如:-- -------------------- ---- ------- -------- ------------------- - -- ------- -------------------- --------- -- ------ ---------------- - ---- ------- ----- ----- -- - -- ------- ---------------------------------- --- -
在此示例中,我们在数据库查询中存储了
key
变量,并在回调函数中读取了它。由于使用了 CLS,即使在异步操作中,我们仍然可以访问共享的上下文变量。
示例代码
以下是一个完整的示例代码,演示了如何使用 cls-hooked 来在异步操作中共享上下文信息。
-- -------------------- ---- ------- ----- --- - ---------------------- ----- ----- - ----------------- -- -- --- -- ----- --------- - ------------------------------------ -- -- ----- --- ----- ---- - ------------------ ----- ------------ ----- ------- --------- --- --------- ------ --- -- - ---- --------- --- -------- ------------------ ---- - ---------------- -- - -- ---------- -- ----- ------ - -------------------------- ----------------------- -------- -- ------ ------------------ - ---- ----- ----- -- - --- --------- ----- ----- -- - -- ----- - ------------------- ------ ------------------------------ ------ -------- - -- ------ ------------------ - ---- ------ ----- ------- - --- --------- ----- ----- -- - -- ----- - ------------------- ------ ------------------------------ ------ -------- - -- ------- -- ------------------------------------- -- ---- ---------- ----- -------- ------- ------------- --- --- --- --- - -- ----- ----- ---- - ---------------- ----------------------------------------------
在这个示例中,我们在 HTTP 请求处理函数中使用 CLS,保存了当前请求的用户 ID,并在后续的数据库查询中共享了该信息。这样,在异步操作中,我们仍然可以访问到这个共享的上下文变量。
总结
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/53704