使用 Hapi.js 构建真正的 Web 服务

Hapi.js 是一个流行的 Node.js 框架,被广泛应用于企业级 Web 应用的开发中。它拥有丰富的功能和选项,并且易于扩展。在本文中,我们将探讨如何使用 Hapi.js 构建一个真正的 Web 服务,包括如何添加路由、使用插件、管理会话和验证用户等。

安装 Hapi.js

首先,我们需要在本地安装 Hapi.js。在终端中执行以下命令即可安装:

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

这将在您的项目中安装 Hapi.js 并引入它所需的所有依赖项。

创建基本服务器

Hapi.js 的主要组成部分是服务器,用于处理 HTTP 请求并返回响应。在我们开始添加路由或其他功能之前,我们需要先创建一个基本的服务器。

创建一个新文件 server.js,并输入以下内容:

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

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

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

-------

在这里,我们使用 require() 导入 Hapi.js 模块并创建一个新的服务器实例。host 属性指定我们希望服务器监听哪个主机名或 IP 地址,而 port 属性指定我们想要监听的端口号。在这个例子中,服务器将监听 localhost:3000init() 函数用于启动服务器,并在控制台中打印服务器的地址。

在终端中运行以下命令:

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

如果一切工作正常,则会在控制台中看到类似于以下输出:

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

您已经成功启动了 Hapi.js 服务器。

添加路由

路由是 Web 服务的主要组成部分之一。它们用于将传入的请求映射到指定的处理程序函数,并将响应发送回客户端。

在我们的示例中,让我们添加一个基本的路由,以便用户可以通过 / 路径向我们的服务器发出 GET 请求,并返回 Hello, world! 字符串。

将以下代码添加到 server.js 文件中:

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

在这里,我们使用 server.route() 方法添加一个新的路由。 method 属性定义了该路由需要处理的请求类型,path 属性指定该路由需要匹配的 URL 路径。当客户端向匹配的路径发送请求时,handler 函数将被调用。它将带有包含有关请求的信息的 requesth 参数。在我们的示例中,服务器将返回 Hello, world! 字符串。

在终端中重新运行我们的服务器,然后在浏览器中访问 http://localhost:3000。您应该能够看到浏览器中显示的 Hello, world! 字符串。

使用插件

Hapi.js 插件可用于扩展服务器的功能。有些插件是官方支持的,而其他插件则是社区驱动的。在我们的示例中,让我们添加 hapi-auth-cookie 插件,以便支持基于 cookie 的身份验证。

首先,我们需要将该插件添加到我们的 package.json 文件中:

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

然后安装插件:

--- -------

现在我们可以将插件添加到我们的服务器中:

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

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

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

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

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

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

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

-------

在这里,我们首先使用 require() 导入我们需要的插件,然后使用 await server.register() 方法将它们注册到服务器中。server.auth.strategy() 方法为默认的路由配置添加了一个名为 session 的策略。在本例中,我们使用基于 cookie 的身份验证机制。定义了 cookie 属性,包含了有关 cookie 的详细信息,包括要使用的 cookie 名称、路径、密码、是否安全等。

validateFunc 方法用于检查用户是否存在于数据库中,并返回验证结果。在我们的示例中,我们模拟了一个 User 类,用于检查传递的 session.idsession.password 是否有效。

管理会话

使用 hapi-auth-cookie 插件,我们可以轻松地在 Hapi.js 中管理会话。会话是在服务器和 Web 客户端之间建立的一段连接,允许客户端与服务器交换有关特定用户的信息。

在我们的示例中,让我们添加两个新的路由,以允许用户登录和注销。

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

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

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

在这里,我们首先添加了 /login 路径的 GET 路由,它将呈现一个简单的 HTML 表单,其中包含用户名和密码输入框。当用户提交表单时,它将使用 POST 路由来检查用户名和密码是否正确,并在通过验证时在客户端中设置一个名为 sid 的 cookie。

然后,我们添加了 /logout 路径的 GET 路由,它将清除以前设置的 cookie 并重定向到首页。

请注意,我们在 /login/logout 路径的路由中都使用了 options.auth 属性。在 Hapi.js 中,此属性用于指定路由是否需要身份验证。 auth: false 表示不需要身份验证,而 auth: 'session' 表示需要身份验证。

在终端中重新启动 Web 服务后,您现在可以执行 /login/logout 路径,以管理会话和用户身份验证。

验证用户

Hapi.js 允许我们轻松地实现用户身份验证。在我们的示例中,让我们创建一个名为 User 的类,以模拟一个真实的用户。

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

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

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

在这里,我们使用 class 创建一个 User 类。它有两个属性:idpassword,以及一个名为 findByCredentials 的静态方法,该方法用于检查传递的 ID 和密码是否有效。

在我们的示例中,findByCredentials 方法只是检查传递的值是否与预定义的值匹配。在实际的 Web 服务中,您应该使用数据库或其他存储机制来检查用户的凭据是否有效。

现在,我们已经创建了一个 User 类,让我们更新 /login 安装程序,以使用 User.findByCredentials 方法来检查传递的用户名和密码是否正确。

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

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

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

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

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

在这里,我们首先从请求有效载荷中提取 usernamepassword 的值。然后,我们使用 User.findByCredentials 方法检查传递的凭据是否有效。如果它们有效,则在 cookie 中设置 user.iduser.password 的值。

在客户端的下一页加载时,request.auth.credentials 对象将包含有关当前经过身份验证的用户的信息。

结论

通过使用 Hapi.js,我们可以轻松创建功能丰富且易于扩展的 Web 服务。在本文中,我们探讨了如何安装 Hapi.js、添加路由、使用插件、管理会话和验证用户等技术。我们希望这些技术对于您的下一个 Web 服务项目非常有用。在我们的示例中,您可以通过访问 http://localhost:3000 来检查我们的服务器。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/670a124bd91dce0dc87e5cac