npm 包 @plan3-relate/hapi-cls 使用教程

阅读时长 11 分钟读完

简介

@plan3-relate/hapi-cls 是一个基于 Hapi 框架实现的 Node.js 应用程序的上下文管理工具,它提供了一种简洁的方式来管理全局上下文数据。这个工具支持基于 Continuation-Local Storage (CLS) 的数据存储,它允许您在异步请求链中共享上下文数据,包括日志跟踪、事务处理等场景。

本文将详细介绍 @plan3-relate/hapi-cls 的使用方法及其应用场景。

安装

获取 @plan3-relate/hapi-cls 可以通过 npm 命令进行安装:

使用

@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 日志记录器看到如下输出:

在上述日志输出中,我们可以看到每个请求的 correlationId 属性,它是从请求 header 中获取的。这些请求上下文数据共享在异步请求链中,并将跟踪整个请求的处理过程。

总结

在本文中,我们介绍了 @plan3-relate/hapi-cls 工具的使用方法及其应用场景。我们讲解了它提供的 createContextgetContextrunWithContext 等 API,以及如何使用这些 API 来管理异步请求的上下文数据。我们还演示了一个完整的示例代码,它介绍了如何使用 @plan3-relate/hapi-cls 和 Bunyan 日志记录器来跟踪异步请求的日志。我们相信,通过本文的介绍,您已经掌握了如何使用 @plan3-relate/hapi-cls 工具来管理全局上下文数据的技能。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/60055e6581e8991b448dbc8f

纠错
反馈