当我们开发 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:
npm i hapi-boom-decorators --save
然后在我们的代码中,引入插件:
-- -------------------- ---- ------- ----- ---- - --------------- ----- ---- - ------------------------------- ----- ------ - --- ------------- ------------------- ----- ---- -- --------------------- --- -- - -- ----- - ------------------- -- ---- ---------------------- - ---- - --------------------------------- ------ -------------- - --
现在我们已经可以使用 Boom 来返回 HTTP 错误了。例如,如果我们想在路由中处理一个 404 错误,可以在路由处理程序中返回一个 Boom 函数:
-- -------------------- ---- ------- ----- -------- - --------- ------ -- - ----- ----- - -- --- -- ----- ------ -- - --- -- ----- ------ -- -- ------------- --- -- - ------ ----------------------- ----- -------- - ------ ------------ - -------------- ------- ------ ----- --------- -------- -------- --
如果路由处理程序中出现了错误,我们可以使用 Boom 的其他函数来处理:
const getUsers = (request, reply) => { const err = new Error('Unable to get users') return reply(Boom.badRequest(err.message, err)) }
在这种情况下,我们使用了 Boom.badRequest 函数来返回一个 400 错误。该函数使用了前两个参数进行错误消息的设置,第三个参数(如果存在)可以用来传递任何其他信息。
除此之外,Boom 工具集还提供了许多其他函数,比如 Boom.forbidden、Boom.unauthorized 等等,可根据具体需求进行应用。
3. 自定义 Boom 错误
有时候内置的错误类型并不总能完全满足我们的需求,这时候我们可以通过自定义错误类型来实现更好的错误处理。
const myCustomError = (message, data) => { const error = Boom.badData(message) error.output.payload.data = data return error }
在这个例子中,我们创建了一个名为 myCustomError 的错误,并使用 Boom.badData 函数定义了错误类型。然后,我们对错误信息进行了定制,传递了自定义数据。这个错误类型仍然符合标准的 HTTP 400 错误,但现在包含了有意义的信息。
4. 总结
Boom 是一个非常实用的错误处理库,可以让我们在 Hapi 中方便地处理 HTTP 错误。它不仅可以自动生成常见的 HTTP 错误并提供默认消息,而且还可以方便地自定义错误类型。
通过使用 hapi-boom-decorators 插件,我们甚至可以更加简化 Boom 的使用过程,让我们的代码更加易读和易维护。
参考示例代码:
-- -------------------- ---- ------- ----- ---- - --------------- ----- ---- - --------------- ----- ------ - --- ------------- ------------------- ----- ----- ----- ----------- -- ------------------------------------------------ --- -- - -- ----- - ---------------- --------------- - -------------- ------- ------ ----- ---- -------- --------- ------ -- - ------ ------------- -------- - -- -------------- ------- ------ ----- ---------------------- -------- --------- ------ -- - ------ ----------------------------- --- -------- - -- -------------- ------- ------ ----- ---------------- -------- --------- ------ -- - ------ ---------------------- ------------- -------- - ----------- --- --- - -- -- ---------------- -- - -- ----- - ---------------- - ------------------- ------- --- -------------------- --
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64cdbb801519ea946c189f78