基于 Hapi 框架构建 Node.js 服务端架构实践

阅读时长 11 分钟读完

Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境, 由于其轻量级、高效性以及事件驱动的特点,使其在构建高并发、高可用的服务端应用时有着广泛的应用。 但是,Node.js 的运行环境纯粹只是一个执行 JavaScript 的环境,并没有提供一个完整的服务端应用的开发框架。因此,借助于现有的构建 Web 应用的开发框架来搭建 Node.js 服务端应用也成为了目前的主流。

在众多的 Web 应用框架当中,Hapi 可谓是一个独具特色的开发框架。它具有源生支持插件的特点,让开发者能够更加轻松的定制自身的服务端应用,并且在性能方面有着比同类框架更大的优势。在本文中,我们将通过 Hapi 应用开发为例,详细介绍基于 Hapi 框架构建 Node.js 服务端架构实践。

Hapi框架介绍

Hapi 是一个基于 Node.js 平台的 Web 开发框架,它用于创建服务端应用程序。Hapi 框架源生支持插件,目标是能够帮助开发人员轻松地构建高性能、可扩展的服务端应用程序。

Hapi 是一个功能强大的框架,它可以帮助开发人员提高代码重用性、模块化和可测试性。Hapi 的架构是设计清晰和模块化的,开发者可以非常简单地扩展或替换其功能以适应特定的需求。 Hapi 提供的插件架构使得它较其他 Node.js 的服务端框架更加容易扩展。

除了插件体系外,Hapi 还提供了全面的 API 文档、教程、样例代码以及丰富的社区支持。这些保证了 Hapi 框架在 Node.js 服务端应用的开发中是具有高效性、精准性,而且非常的灵活。

Hapi 应用实现

下面我们以一个简单的 Hapi 应用实现为例,来详解 Hapi 针对 Node.js 服务端开发的支持。

应用启动

-- -------------------- ---- -------
----- ---- - ----------------------

----- ---- - ----- -- -- -
    ----- ------ - -------------
        ----- -----
        ----- -----------
    ---

    --------------
        ------- ------
        ----- ----
        -------- --------- -- -- -
            ------ ------ --------
        -
    ---

    ----- ---------------
    ------------------- ------- ----- -----------------
--

-------------------------------- ----- -- -
    -----------------
    ----------------
---

-------

在此代码示例中,我们使用Hapi框架创建了一个新的服务端实例,并在其上面定义了一个名为 "hello" 的路由。路由定义 handler 函数,以便在客户端请求时返回 "Hello World" 的字符串。在 server.start() 函数调用完成后,我们监听在3000端口上开始监听请求。

路由设置

在 Hapi 框架中,定义路由是一个非常容易且直观的事情。路由分为 GET、POST、PUT、DELETE 等等各类请求类型;定义方法可以有字符串和正则表达式两种方式,借助于 Hapi 内置的 joi 库,你能够非常容易实现参数验证和数据量控制。下面我们来看一个例子:

-- -------------------- ---- -------
--------------
    ------- -------
    ----- -----------------
    -------- --------- -- -- -
        ----- ---- - ----------------
        -- ------
        ------ -------------------- ----------------------
    --
    -------- -
        ------------ -------
        ------ -------------
        ----- --------
        --------- -
            -------- ------------
                --------- ------------------------
                --------- ------------------------------
            --
        -
    -
---

在此代码示例中,我们定义了一个路由,它接收 POST 方式请求,路径为 /user/register,相关的逻辑就是新增或者更新一个用于注册。由于我们使用了 Hapi 的内嵌 joi 库,所以参数的验证和控制非常容易。

hapi-swagger 插件

hapi-swagger 是由 Hapi 社区开发的一个插件,它有一个非常重要的特点,就是存在一组对所描述 Api(例如参数,http 方法,请求体,响应体等)的相关元数据的一个标准化,严谨的介绍,也包括了数据的效验规范,权限认证等等信息。

-- -------------------- ---- -------
----- ---- - ----------------------
----- ----------- - ------------------------
----- ----- - -----------------------
----- ------ - ------------------------
----- ---- - ---------------------

----- -------- ------- -
    ----- ------ - ------------- ----- ----- ----- ----------- ---

    ----- -------------- - -
        ----- -
            ------ ---- ---------------
            -------- -------------
        -
    --

    ----- -----------------
        ------
        -------
        -
            ------- ------------
            -------- --------------
        -
    ---

    --------------
        ------- -------
        ----- -----------------
        -------- --------- -- -- -
            ----- ---- - ----------------
            -- ------
            ------ -------------------- ----------------------
        --
        -------- -
            ------------ -------
            ------ -------------
            ----- --------
            --------- -
                -------- ------------
                    --------- ------------------------
                    --------- ------------------------------
                --
            --
            -------- -
                --------------- -
                    ---------- -
                        ------ -
                            -------------- -----
                            --------- ------------
                                -------- ------------
                            --
                        --
                        ------ -
                            -------------- ---- ---------
                            --------- ------------
                                -------- ------------
                            --
                        --
                        ------ -
                            -------------- ---- ------
                        -
                    --
                    ------------ ------
                -
            -
        -
    ---

    ----- ---------------
    ------------------- -- ------- -- ---------------------
-

-------------------------------- ----- -- -
    -----------------
    ----------------
---

--------

在此代码示例中,Hapi 服务端程序首先使用了 inert 和 vision 插件,用于处理静态文件和视图的支持。之后,引入了 HapiSwagger 插件。之后我们定义了路由,它接收 POST 方式请求,路径为 /user/register,相关的逻辑就是新增或者更新一个用于注册。将需要输出的参数使用 'hapi-swagger' 的插件功能输出,以便于更好的实现自动化文档。

前置钩子函数

Hapi 提供了直接在路由前置钩子函数的功能。这就意味着,当一个请求来临时,你可以让你的请求提前经过一个函数中间件,从而进行一些些必要的逻辑,以便于在路由处理之前做好准备。

-- -------------------- ---- -------
----- ---- - ----------------------
----- --- - ---------------

----- -------- ------- -
    ----- ------ - ------------- ----- ----- ----- ----------- ---

    ----------------------- -------- --------- -- -
        --------------- -------------------- - - - - - --------------
        ------ -----------
    ---

    --------------
        ------- ------
        ----- ----
        -------- --------- -- -- -
            ------ ------ --------
        -
    ---

    --------------
        ------- -------
        ----- -----------------
        -------- --------- -- -- -
            ----- ---- - ----------------
            -- ------
            ------ -------------------- ----------------------
        --
        -------- -
            ------------ -------
            ------ -------------
            ----- --------
            --------- -
                -------- ------------
                    --------- ------------------------
                    --------- ------------------------------
                --
            -
        -
    ---

    ----- ---------------
    ------------------- -- ------- -- ---------------------
-

-------------------------------- ----- -- -
    -----------------
    ----------------
---

--------

在上述代码中,通过 server.ext('onRequest', function (request, h) {}) 就实现了前置钩子函数的功能,在这里我们打印出每个请求的路径,从而进行一些简单的统计。

总结

Hapi 框架是一个功能强大的 Web 应用框架,在相对于其他框架来说,Hapi 提供了源生支持插件、api文档自动生成以及掌控请求的机制等等。这些优点使得 Hapi 成为构建高性能、模块化、可扩展的 Node.js 服务端应用程序的首选框架。Hapi 可以给应用程序带来优势,使之有更精确更可控的设计。

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

纠错
反馈