在 Hapi 中使用 Boom 实现统一的接口异常

阅读时长 6 分钟读完

当我们开发 RESTful API 时,异常处理是不可避免的一部分。而 Hapi 是一款相当受欢迎的 Node.js Web 框架,它提供了许多内置的插件和工具来简化开发流程,一个非常实用的工具是 Boom,它可以让我们在 Hapi 中方便地处理 HTTP 错误。

1. Boom 是什么?

Boom 是一个可以生成 HTTP 错误的工具集,它可以方便地定制出合适的错误,并且包含了一些常见的 HTTP 错误,例如 401(未经授权)、404(未找到)和 500(内部服务器错误)等。

Boom 的设计原则是使错误处理变得更加容易和一致,开发者只需要关注自己的逻辑,而不必担心错误处理的细节。

2. Boom 的用法

在 Hapi 中使用 Boom,最好的方式是定义一个自定义的错误处理函数,并在路由上注册它。我们可以使用 hapi-boom-decorators 插件来简化 Boom 的使用流程。

首先,我们需要安装 hapi-boom-decorators:

然后在我们的代码中,引入插件:

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

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

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

现在我们已经可以使用 Boom 来返回 HTTP 错误了。例如,如果我们想在路由中处理一个 404 错误,可以在路由处理程序中返回一个 Boom 函数:

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

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

如果路由处理程序中出现了错误,我们可以使用 Boom 的其他函数来处理:

在这种情况下,我们使用了 Boom.badRequest 函数来返回一个 400 错误。该函数使用了前两个参数进行错误消息的设置,第三个参数(如果存在)可以用来传递任何其他信息。

除此之外,Boom 工具集还提供了许多其他函数,比如 Boom.forbidden、Boom.unauthorized 等等,可根据具体需求进行应用。

3. 自定义 Boom 错误

有时候内置的错误类型并不总能完全满足我们的需求,这时候我们可以通过自定义错误类型来实现更好的错误处理。

在这个例子中,我们创建了一个名为 myCustomError 的错误,并使用 Boom.badData 函数定义了错误类型。然后,我们对错误信息进行了定制,传递了自定义数据。这个错误类型仍然符合标准的 HTTP 400 错误,但现在包含了有意义的信息。

4. 总结

Boom 是一个非常实用的错误处理库,可以让我们在 Hapi 中方便地处理 HTTP 错误。它不仅可以自动生成常见的 HTTP 错误并提供默认消息,而且还可以方便地自定义错误类型。

通过使用 hapi-boom-decorators 插件,我们甚至可以更加简化 Boom 的使用过程,让我们的代码更加易读和易维护。

参考示例代码:

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

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

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

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

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

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

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

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

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

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

纠错
反馈