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

阅读时长 9 分钟读完

在前端开发中,经常需要与后端开发人员协作开发接口。为了更好地管理和维护这些接口,需要封装好的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

纠错
反馈