解决 Hapi 框架在使用 Hapi-Swagger 插件时出现的参数类型读取错误问题

阅读时长 7 分钟读完

背景

Hapi 是基于 Node.js 的企业级 Web 应用框架,提供了一系列插件和工具,使得开发者可以快速搭建 Web 应用。Hapi-Swagger 是 Hapi 的一个插件,它可以自动生成 API 文档并提供 Swagger UI 的可视化界面,方便开发和测试。

但是,在使用 Hapi-Swagger 插件时,我们有可能会遇到一个参数类型读取错误的问题。例如,我们在定义路由的时候,通过 config.validate 来验证请求参数的类型,如下所示:

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

当我们启用 Hapi-Swagger 插件并访问 Swagger UI 界面时,会发现请求参数的类型不正确,如下所示:

实际上,这是因为 Hapi-Swagger 插件默认使用的是 inert 插件来处理静态文件,而 inert 插件会将请求体作为文件读取并解压,因此导致参数类型读取错误。

解决方案

要解决参数类型读取错误的问题,我们可以使用 hapi-swaggered 插件,它是对 Hapi-Swagger 插件的增强版,可以完美兼容 Hapi 的验证机制,并且支持将请求体转为 application/json 格式,从而避免了参数类型读取错误的问题。

以下是使用 hapi-swaggered 插件来定义路由的示例代码:

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

其中,我们需要将 config.validate 改为 validate,并添加其他的描述信息,如 descriptionnotestags 等,这些信息都会被用于自动生成 API 文档。

同时,我们还需要在 server.register 方法中引入 hapi-swaggered 插件,如下所示:

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

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

其中,我们需要将 register 方法的参数改为一个数组,包含了 hapi-swaggered 和 hapi-swaggered-ui 两个插件。在 hapi-swaggered 插件中,我们可以配置 tagsinfo 等参数,用于生成 API 文档。在 hapi-swaggered-ui 插件中,我们需要指定 Swagger UI 的访问路径 path 和页面标题 title,同时设置 validatorUrlnull,以避免在 Swagger UI 页面中出现请求参数类型读取错误的提示。

总结

Hapi-Swagger 是一款非常方便的 API 文档自动生成工具,但是在使用它的过程中,我们可能会遇到参数类型读取错误的问题。为了解决这个问题,我们可以使用 hapi-swaggered 插件来完美兼容 Hapi 的验证机制,并支持将请求体转为 application/json 格式,从而解决参数类型读取错误的问题。同时,我们还可以通过 hapi-swaggered 和 hapi-swaggered-ui 插件来自动生成完整的 API 文档。

示例代码:

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

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

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

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

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

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

纠错
反馈