基于 Hapi 的 API 封装实践及实例分析

在前端开发中,经常需要与后端开发人员协作开发接口。为了更好地管理和维护这些接口,需要封装好的API,提供给团队中的其他开发人员使用。

本文将介绍如何基于 Hapi 框架进行 API 封装,包括路由配置、校验和响应处理等。通过具体实例的分析,您将学习到如何更好地组织和管理 API。

准备工作

首先,您需要安装 Hapi 框架。可以在 官网 查看具体的安装和使用方式。在安装完成后,创建一个新项目。

在项目中,您需要安装以下依赖:

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

其中,joi 用于参数校验,@hapi/hapi 是 Hapi 的核心模块,@hapi/boom 用于在出现错误时返回错误信息。

路由

在 Hapi 中,所有路由都需要在服务器启动前进行声明。路由由路径(route)、方法(method)、处理程序(handler)和其他的一些参数组成,其中处理程序是请求到达时要执行的函数。

下面展示一个基本的路由示例:

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

这个路由定义了路径 /hello 和方法 GET,当请求到达时,返回响应 Hello World!。在实际开发中,我们需要定义更多的路由。因此,我们需要更好地组织和管理路由。

分离路由

针对不同的功能,我们可以将路由分离到不同的文件中,减少单个文件的代码量,更易于管理和维护。假设我们的 API 包括用户路由、订单路由和商品路由,我们可以按照这个结构进行组织:

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

user.js 文件中,我们可以声明用户相关的路由:

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

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

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

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

order.js 文件中,我们可以声明订单相关的路由:

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

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

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

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

product.js 文件中,我们可以声明商品相关的路由:

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

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

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

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

参数校验

在实际开发中,我们需要校验请求中的参数是否符合规范。为了解决这个问题,我们可以使用 joi 模块。joi 提供了一种定义规范的方式,并可以将它们应用于任何 JavaScript 对象。

下面展示一个校验请求参数的路由示例:

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

在这个路由中,我们定义了一个对象模式来校验请求的数据。其中:

  • Joi.string() 表示参数必须为字符串类型;
  • Joi.number() 表示参数必须为数字类型;
  • Joi.alphanum() 表示必须为字符和数字的组合;
  • Joi.string().email() 表示必须符合邮箱格式;
  • Joi.string().pattern(new RegExp('^[a-zA-Z0-9]{3,30}$')) 表示必须符合正则表达式的要求;
  • Joi.object() 表示参数必须为对象类型;
  • Joi.ref('password') 表示必须与 password 参数相同;
  • Joi.number().integer().min(1900).max(2013) 表示必须为整数类型且在指定的范围内。

错误处理

为了在出现错误时返回更加明确的错误信息,我们可以使用 @hapi/boom 模块。@hapi/boom 可以帮助我们封装错误信息,并将它们返回给客户端。

下面展示一个处理错误的路由示例:

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

在这个路由中,我们使用了 Boom.notFound 来封装错误信息,并将它们返回给客户端。除了 notFound@hapi/boom 还提供了其他的函数来封装错误信息。

总结

在这篇文章中,我们介绍了如何基于 Hapi 框架进行 API 封装,包括路由配置、参数校验和错误处理。通过具体实例的分析,您学习到了如何更好地组织和管理 API。

在实际开发中,我们可以将路由分离到不同的文件中,并且根据需要进行参数校验和错误处理,从而更好地管理和维护 API。

来源:JavaScript中文网 ,转载请联系管理员! 本文地址:https://www.javascriptcn.com/post/646d74e3968c7c53b0c2131b


猜你喜欢

  • Redis 与 MySQL 实现数据同步的方案

    概述 Redis 是一个内存数据结构存储系统,与 MySQL 数据库的关系型数据存储方式不同,但 Redis 的存储速度非常快,读写操作的效率远高于 MySQL。因此,如果我们需要在应用程序中实现数据...

    1 年前
  • ES7 中使用 Object.getOwnPropertyDescriptors() 方法获取对象的属性描述符

    在前端开发中,我们常常需要获取对象的属性描述符来进行一些业务逻辑处理,例如在渲染页面中动态地改变某些元素的样式等等。在 ES7 中,JavaScript 提供了一种方便快捷地获取对象属性描述符的方法 ...

    1 年前
  • TypeScript 中的字符串类型

    在 TypeScript 中,字符串是一种基本的数据类型。在 TypeScript 中,字符串类型用于表示文本类型的数据,即一系列按照一定顺序排列的字符。TypeScript 提供了强类型的支持,可以...

    1 年前
  • Next.js 应用中如何使用图片资源?

    前言 在前端应用中,图片资源是必不可少的一部分,然而在 Next.js 应用中使用图片资源相较于其他前端框架而言,存在着一些不同点。本文将重点讲解在 Next.js 应用中如何使用图片资源。

    1 年前
  • gqlgen:使用 GraphQL 自动生成代码

    GraphQL是一种新型的API查询语言,可以用来替代RESTful API,它有比REST更好的可扩展性和强大的类型系统。gqlgen是使用Go语言实现的自动生成GraphQL代码的工具。

    1 年前
  • ES11 的类型函数:有用但不那么好吗

    在前端开发中,类型是一个极为重要的概念。在 JavaScript 中,虽然有基本数据类型和对象类型,但是类型的比较和转换却十分复杂。因此,我们需要一些工具来帮助我们更好地理解和操作类型。

    1 年前
  • 单元测试最佳实践之使用 Enzyme

    单元测试是前端开发不可或缺的一环,在 React 应用中,Enzyme 是一个非常方便的测试工具。本文将介绍如何使用 Enzyme 来进行单元测试,并分享一些最佳实践。

    1 年前
  • 使用 Custom Elements 开发 Web Components 最佳实践

    随着前端技术的不断发展,Web Components 成为了一种越来越受欢迎的组件化开发方案。而其中的 Custom Elements 则是 Web Components 的核心之一。

    1 年前
  • 基于 Hapi.js 的微信公众号开发实战

    微信公众号开发在现代社会中越来越重要,可以帮助企业完成营销、客服等方面的工作,提高商业效益。本文介绍基于 Hapi.js 的微信公众号开发实践,帮助读者快速了解微信公众号开发流程和技术要点,同时提供实...

    1 年前
  • 响应式设计中遇到的 Video 问题及其解决方法

    随着移动设备的普及,越来越多的用户在移动设备上观看视频,而网页响应式设计已经成为设计师和开发者所追求的目标之一。然而,在响应式设计中,Video 元素会引发一些问题,例如视频大小、加载速度等,本文将探...

    1 年前
  • Mongoose 中如何使用 $elemMatch 操作符?

    在 MongoDB 中,$elemMatch 操作符可以针对数组中的元素进行筛选操作,它可以确保我们只查询符合特定条件的数组元素。而在 Mongoose 中,我们同样可以使用 $elemMatch 操...

    1 年前
  • ES10 中 Promise.allSettled() 和 Promise.any() 新方法使用

    ES10 中 Promise.allSettled() 和 Promise.any() 新方法使用 在 JavaScript 开发中,Promise 是经常使用的异步编程方案。

    1 年前
  • 常用的 Docker 命令

    简介 Docker 是一款开源的容器化技术,可以用来构建、打包和运行应用程序。它可以让开发人员在不同的环境中轻松地运行相同的应用程序,从而减少了开发人员和运维人员之间的工作量。

    1 年前
  • 展望 ESLint 2020

    在当今互联网时代,前端开发已经成为了一项非常重要的任务。随着前端的发展,JavaScript 语言也愈发流行。然而,由于 JavaScript 语言的灵活性,可能会导致代码质量的下降,特别是在一个完整...

    1 年前
  • 解决也许你不知道的 ES12“Object.fromEntries()” 使用问题

    ES12 中新增了一个非常实用的方法 Object.fromEntries(),该方法可以将键值对转化为对象。在实际开发中,可能会遇到一些使用问题,本文将为大家详细介绍如何解决这些问题。

    1 年前
  • 基于 Angular 的文件上传组件开发指南

    上传文件是 Web 应用中常见的功能之一,而 Angular 是一个强大的前端框架,它提供了一些开发文件上传组件的方式,其中最常用的是 ng-file-upload。

    1 年前
  • Web Components 中实现图片上传组件

    Web Components 是一种前端技术,用于创建可重用的自定义 HTML 元素。它们由三个不同的技术组合而成:自定义元素、影子 DOM 和 HTML 模板。 图片上传组件是 Web 应用程序中经...

    1 年前
  • Jest 测试框架:如何进行 UI 测试

    Jest 是一个流行的 JavaScript 测试框架,它提供了简单易用的 API 来编写可靠的单元测试、集成测试和端到端测试。在前端开发中,UI 测试是非常重要的一部分,因为它可以验证我们所编写的代...

    1 年前
  • 在 Redux 中使用 ORM 库管理复杂数据

    在日常的前端开发中,我们常常需要处理包含大量关联数据的复杂模型。针对这种情况,ORM(Object-Relational Mapping,对象关系映射)库是一种有效的解决方案。

    1 年前
  • ES9 中新增的 Promise.allSettled() 实现优雅的并发处理

    在 Javascript 中,使用 Promise 进行异步编程已经成为了标准的做法。但在实际应用中,经常遇到需要并发处理多个 Promise 的情况,而 Promise.all() 方法只要有一个 ...

    1 年前

相关推荐

    暂无文章