使用 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


猜你喜欢

  • Tailwind CSS 中的响应式图片样式的详细教程

    在现代的网站和应用程序中,响应式设计已经成为了一个必须要考虑的因素。而在这个过程中,图片通常是必不可少的一部分。因此,在开发网站和应用程序时,我们需要确保图片在不同设备上具有良好的响应性。

    7 天前
  • Redis 使用教程:设置过期时间

    序言 Redis 是一个非常流行的内存数据库,在前端开发中我们经常使用 Redis 来进行数据缓存,以减轻服务器端的负担。在 Redis 中,我们可以为每个存储的 key 设置过期时间,以便在一定时间...

    7 天前
  • Web Components 开发常见错误及解决方法

    Web Components 是一种基于 Web 平台的技术,可以让开发者创建可重用的自定义 HTML 元素。由于其优秀的可复用性和可组合性,越来越多的前端开发者开始使用 Web Components...

    7 天前
  • 如何在无障碍网站中应用 WAI-ARIA 的最佳实践

    随着互联网的普及,无障碍网站设计已经变成越来越重要的话题。对于那些缺失视力、听力或者其他障碍的用户来说,访问和使用网站可能会变得极为繁琐和受限。WAI-ARIA(Web Accessibility I...

    7 天前
  • Socket.io 与 Kafka 的实时数据传输方案

    实时数据传输是当今互联网应用中重要的一环,能够将数据快速地从一个应用程序传输到另一个应用程序。当然,要实现实时数据传输需要选择合适的技术方案。本文将介绍 Socket.io 和 Kafka,以及它们如...

    7 天前
  • RxJS 实战:如何处理重复的值?

    RxJS 是一个强大的响应式编程库,它提供了一种函数响应式编程的解决方案,并且在前端开发中被广泛应用。在使用 RxJS 时,我们经常会遇到一些重复的值,这时候必须对它们进行处理。

    7 天前
  • 在 ES6 和 ES7 中使用 Object.create() 方法来创建对象

    在 JavaScript 中,创建对象是一项基本任务。一般来说,可以使用字面量对象 ({}) 或构造函数 (例如 new Object()) 来创建对象。但是,这些方法都有其限制,而使用 Object...

    7 天前
  • RESTful API 中的 API 网关重构方法

    在现代的软件系统中,RESTful API 已经成为了不可或缺的部分。而在 RESTful API 的设计中,API 网关是非常重要的环节。API 网关可以处理请求的路由、限流、重试等逻辑,同时也可以...

    7 天前
  • 使用 Web Workers 优化 PWA 应用程序性能

    随着移动浏览器的不断发展,越来越多的网站和应用程序将它们的目光转向了 PWA(渐进式 Web 应用程序),以提供更好的离线体验和更快的加载速度。然而,PWA 应用程序的性能问题往往是一个挑战。

    7 天前
  • Chai 如何控制错误信息输出

    Chai 是一个流行的 JavaScript 断言库,用于编写测试以确保代码的正确性。在测试期间,可能会出现一些错误,这些错误可以以不同的方式呈现给开发人员。本文将介绍如何使用 Chai 库来控制错误...

    7 天前
  • Jest Snapshot:如何生成与使用

    Jest 是一个由 Facebook 开发的 JavaScript 测试框架,它支持多种测试类型,包括单元测试、集成测试和端到端测试等等。其中,快照测试是 Jest 最为流行的一种测试类型之一,它可以...

    7 天前
  • Serverless 架构和 Docker 容器之间的比较与区别

    Serverless 架构和 Docker 容器是当今流行的两种云计算技术,它们都可以帮助我们实现快速部署、可伸缩的应用程序。但是 Serverless 架构和 Docker 容器之间存在许多关键的区...

    7 天前
  • 在 Kubernetes 中发布自定义应用程序的完整指南

    如今,Kubernetes 在云计算和容器编排领域得到越来越广泛的应用。同时,随着前端技术的发展,前端应用程序也越来越复杂。如果你是一个前端开发者,你可以将你的自定义应用程序部署到 Kubernete...

    7 天前
  • 把 reselect 作为 redux 数据处理的最后一步

    在 Redux 应用程序中,使用 reselect 可以更高效地处理数据。reselect 可以将平深层次嵌套的多个数据连接为一个数据,并有助于组织以前使用链式调用嵌套映射器的代码。

    7 天前
  • 使用 ESLint 检查 JavaScript 中的潜在问题

    前言 随着前端技术的发展,JavaScript 已经成为 web 开发领域中最流行的编程语言之一。然而,当我们在编写 JavaScript 代码时,难免会出错。这些错误有可能是语法错误,也有可能是潜在...

    7 天前
  • 在 Fastify 中配置 Node.js 中间件

    Fastify 是一个快速、低开销且低级别的 Node.js Web 框架,拥有诸多特性和插件,使得在构建可靠的 Web 应用程序方面变得更加容易。本文将介绍如何在 Fastify 中配置 Node....

    7 天前
  • Koa2 中 bodyparser 解析 json 数据时出现的 bug 及解决方式

    在 Koa2 中,使用 bodyparser 中间件可以方便地解析请求体中的数据,其中包括解析 json 格式的数据。但是在实际开发中,你可能会遇到一些奇怪的 bug,比如无法正确解析 json 数据...

    7 天前
  • Mongoose 中使用生命周期 hooks 的详细指南

    Mongoose 是 Node.js 的一个 ORM 框架,用于简化与 MongoDB 数据库的交互。Mongoose 提供了许多有用的功能,其中包含生命周期 hooks。

    7 天前
  • 如何将 Tailwind CSS 应用于 WordPress 主题开发中

    在 WordPress 主题开发中,样式是非常重要的。而使用 Tailwind CSS 这样的 CSS 框架能够提高开发效率,同时也能帮助我们更好地管理我们的代码。

    7 天前
  • Apollo 和 Redis:如何缓存 GraphQL 查询

    GraphQL 是一种用于 API 开发的查询语言,它是前端领域的一个重要技术。然而,GraphQL 的查询可能会对服务器造成很大的负荷,导致响应变慢甚至崩溃。为了解决这个问题,我们可以使用缓存技术来...

    7 天前

相关推荐

    暂无文章