简介
@plan3-relate/hapi-cls
是一个基于 Hapi 框架实现的 Node.js 应用程序的上下文管理工具,它提供了一种简洁的方式来管理全局上下文数据。这个工具支持基于 Continuation-Local Storage (CLS) 的数据存储,它允许您在异步请求链中共享上下文数据,包括日志跟踪、事务处理等场景。
本文将详细介绍 @plan3-relate/hapi-cls
的使用方法及其应用场景。
安装
获取 @plan3-relate/hapi-cls
可以通过 npm 命令进行安装:
npm install @plan3-relate/hapi-cls --save
使用
@plan3-relate/hapi-cls
是基于 async_hooks
构建的,因此您需要使用 Node 8 及以上版本。接下来,您需要在 Hapi 应用程序的配置中引入 @plan3-relate/hapi-cls
插件:
-- -------------------- ---- ------- ----- ---- - ---------------- ----- ------- - ---------------------------------- ----- ------ - --- ------------- ----- ------------ ----- ----- --- -- -- ---------------------- -- ----------------- ------- -------- -------- --- ---
上述代码中,我们通过 server.register
方法将 @plan3-relate/hapi-cls
插件注册到 Hapi 服务器中。
API
hapi.cls.createContext()
createContext
方法创建一个新的 CLS 上下文对象,并将其附加到当前异步请求链。createContext
方法在 Hapi 请求处理函数中调用,例如:
-- -------------------- ---- ------- -------------- ------- ------ ----- --------- -------- ----- --------- -- -- - ----- - ------- - - -------- ----- - ------------- - - -------- -- --------- --- --- ----- ------- - --------------------------------------------------------- ---------------------------- --------------- -- ----------- -- --- -- ---
在上述代码中,我们通过 createContext
方法创建了一个 CLS 上下文对象,在上下文中存储了 correlationId
属性,它是从请求 header 中获取的值。可以在使用该方案来实现多个异步函数公用一个 correlationId
的场景。
hapi.cls.getContext()
getContext
方法获取当前异步请求链中的 CLS 上下文对象。您可以在您的代码中调用 getContext
方法来获取当前异步请求链中共享的上下文数据,例如:
-- -------------------- ---- ------- -------------- ------- ------ ----- --------- -------- ----- --------- -- -- - -- ---------- ------- ----- ------- - ------------------------------------------------------ ----- ------------- - ----------------------------- -- ----------- -- --- -- ---
在上述代码中,我们通过 getContext
方法获取当前异步请求链中共享的上下文数据,然后从上下文对象中读取 correlationId
属性。
hapi.cls.runWithContext()
runWithContext
方法运行一个异步函数并将 CLS 上下文注入到它的执行上下文中,例如:
-- -------------------- ---- ------- -------------- ------- ------ ----- --------- -------- ----- --------- -- -- - -- ---------- ------- ----- ------- - ------------------------------------------------------ -- ----------------------- ----- ------ - ----- ---------------------------------------------------------------- ----- -- -- - -- ----------- -- --- ------ ------- --- -- ---- -- --- -- ---
示例
我们来看一个完整的示例代码,它演示了如何使用 @plan3-relate/hapi-cls
来跟踪异步请求的日志:
-- -------------------- ---- ------- ----- ---- - ---------------- ----- ------- - ---------------------------------- ----- ------ - ------------------ ----- ------ - --- ------------- ----- ------------ ----- ----- --- -- -- ---------------------- -- ----------------- ------- -------- -------- --- --- -- --- ------ ----- ----- --- - --------------------- ----- -------- ------------ ---------------------- ------ ------- --- -- --- --------------- ----- ------------- - ----- --------- -- -- - ----- - ------- - - -------- ----- - ------------- - - -------- -- --------- --- --- ----- ------- - --------------------------------------------------------- ---------------------------- --------------- -- - --- -------- ---------- ------------- -- ---- ---------- -- -------- ------ ----------- -- -- ------------ ----- ------------- - ----- --------- -- -- - -- ---------- ------- ----- ------- - ------------------------------------------------------ ----- ------------- - ----------------------------- -- - --- -------- ---------- ------------- -- -------- --- -------- -- -------- ------ ----------- -- -------------- ------- ------ ----- --------- -------- ----- --------- -- -- - -- -- -------------- ---------- --- ------------- ----- ------ - ----- ---------------------------------------------------------------- ----- -- -- - ----- - ------- - - -------- ----- - ------------- - - -------- -- --------- --- --- ----- ------- - --------------------------------------------------------- ---------------------------- --------------- -- - --- -------- ---------- ------------- -- ---- ---------- -- ----------- -- --- --- -- - --- -------- ---------- ------------- -- -------- ------------ -- ---- -- --- -- --- -- -- --- ---- --- --- ------------ ----- ------------ ------- -------------- --- ------------ ----- ------------- ------- -------------- --- -- -- ---- --- ---------------
在上述示例中,我们创建了一个 Hapi 服务器,并注册了 @plan3-relate/hapi-cls
插件。我们还创建了一个 Bunyan 日志记录器,它将用于记录每个请求的日志,实现了一个 log 中间件和 biz 中间件,在这些中间件中我们使用 @plan3-relate/hapi-cls
来共享请求上下文数据,并将其添加到日志记录器中。最后,我们启动 Hapi 服务器。
运行上述示例代码后,您将能够通过 Bunyan 日志记录器看到如下输出:
{"name":"myapp","hostname":"localhost","pid":1001,"level":30,"correlationId":"abcde12345","msg":"new request","time":"2022-04-01T12:00:00.000Z","v":0} {"name":"myapp","hostname":"localhost","pid":1001,"level":30,"correlationId":"abcde12345","msg":"running biz logic","time":"2022-04-01T12:00:01.000Z","v":0} {"name":"myapp","hostname":"localhost","pid":1001,"level":30,"correlationId":"abcde12345","msg":"request completed","time":"2022-04-01T12:00:02.000Z","v":0}
在上述日志输出中,我们可以看到每个请求的 correlationId
属性,它是从请求 header 中获取的。这些请求上下文数据共享在异步请求链中,并将跟踪整个请求的处理过程。
总结
在本文中,我们介绍了 @plan3-relate/hapi-cls
工具的使用方法及其应用场景。我们讲解了它提供的 createContext
、getContext
、runWithContext
等 API,以及如何使用这些 API 来管理异步请求的上下文数据。我们还演示了一个完整的示例代码,它介绍了如何使用 @plan3-relate/hapi-cls
和 Bunyan 日志记录器来跟踪异步请求的日志。我们相信,通过本文的介绍,您已经掌握了如何使用 @plan3-relate/hapi-cls
工具来管理全局上下文数据的技能。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/60055e6581e8991b448dbc8f