Fastify是一种用于构建Web应用程序和API的快速和低开销开源Web框架。其中一个主要的优点是,它的代码质量非常高,并且针对性能进行了优化。在本文中,我们将介绍Fastify框架的异常处理机制,并演示如何在您的应用程序中使用它来获取更好的性能和可靠性。
快速概述
在Fastify框架中,异常处理机制是一个非常重要的组成部分。简而言之,它使您能够对服务器端的异常进行处理,例如:
- 未处理的错误:例如由于API调用缺少关键参数而导致的错误
- 运行时错误:例如函数调用失败或数据库查询错误
默认情况下,Fastify捕获所有未处理的错误,并向客户端发送HTTP 500代码。然而,您可以使用一些技术来更好地处理这些错误,例如:
- 添加自定义错误处理程序
- 启用全局异常处理机制
- 处理「预期」异常,例如第三方API的响应状态代码错误
现在,让我们深入研究Fastify的异常处理机制如何工作及如何有效实现它。
默认异常处理
默认情况下,Fastify提供了一个基本的异常处理机制,可以处理大多数常见的未处理错误(例如未定义的参数)。如果发现错误,Fastify会在服务器上下文中设置一个错误对象,并向客户端发送HTTP 500代码。
fastify.get('/', async (req, res) => { throw new Error('something went wrong!') })
在此示例中,当执行此Get请求时Fastify将返回HTTP 500。Fastify还将为此错误对象设置一些有用的属性(如消息和堆栈跟踪),以便调试和记录。
但是,如果您需要更多的自定义异常处理,那么Fastify也允许您更改这种行为。让我们看看如何实现自定义异常处理程序。
用于自定义错误处理
Fastify允许您基于路由和应用程序级别编写自定义异常处理程序。这将使您能够捕获应用程序中的每个错误,并执行自定义逻辑。以下是一个简单的自定义错误处理程序的示例:
fastify.setErrorHandler(function (err, request, reply) { request.log.error(err) reply.status(500).send({ error: 'Something went wrong.' }) })
在这个示例中,我们设置了一个应用程序级别的异常处理程序。当Fastify捕获到错误时,它将调用此处理程序并将错误传递给它。在此处理程序中,我们选择记录错误并向客户端发送HTTP 500响应。
如果要更改某个路径的异常处理程序,您可以在路由功能中添加onError处理程序。例如:
-- -------------------- ---- ------- ---------------- ----- ----- ---- -- - ----- --- ---------------- ---- -------- -- -------------------------------- ----- -------- ------ - ---------------------- ------------------------ ------ ---------- ---- ------- -- -- -------------------------------- ----- -------- ------ - ---------------------- ------------------------ ------ ---------- ---- ------- -- --
在这个示例中,我们定义了一个在根路径上引发错误的路由。Fastify将捕获此错误并调用应用程序级别的处理程序。但是,仅在该路径上重写了onError处理程序。因此,这将覆盖应用程序级别的处理程序。这可以让您更细粒度地控制错误处理程序的行为。
除此之外,Fastify还提供了其他有用的功能,例如:
- 将SLF4J记录引入应用程序级别和路径级别的运行时日志。
- 将自定义错误对象属性添加到Fastify.setErrorHandler()调用。
- 将响应属性添加到Fastify.onRequest()或Fastify.preHandler()功能中。
在使用时,我们建议检查官方文档,以了解您可以在Fastify上执行的操作。现在,让我们看看如何启用全局异常处理机制。
全局异常处理
在某些情况下,您可能需要在整个应用程序中添加一个全局异常处理程序。此外,Fastify允许您将多个异常处理程序链接在一起,以在处理程序中灵活设置错误。
以下是一些示例代码:
-- -------------------- ---- ------- ----- --------- - -------- --- -- - -- -- -- -- - ------ - - - - ---- - ----- --- -------------- ----------- - - ----------------------------- ---- ------ -- - ------------------ ------------------------ ------ - ----- ---------------- -------- ---------- ---------- ---------- -- -- -- ---------------- ----- ----- ---- -- - ----- ------ - ---------------------- ------------ ---------- ------ -- --
在此示例中,我们定义了一个名为“calculate”的简单计算函数,该函数在缺少参数时引发错误并返回HTTP 500。
Fastify.setErrorHandler()将指定一个处理程序,在Fastify在整个应用程序中捕获错误时执行。在此处理程序中,我们记录了错误并向客户端发送HTTP 500。
现在,在路由功能中,我们实际上没有设置任何onError处理程序。然而,这不是问题,因为我们的精明程序员会在整个应用程序中执行相同的错误处理程序。
处理预期异常
在Web应用程序中,您可能需要处理特定类型的异常。例如,您可能需要处理API调用的特定错误代码(例如400或401)。Fastify提供了内置的异常处理机制,使您能够捕获特定类型的错误并执行自定义逻辑。
以下是一个示例:
-- -------------------- ---- ------- ---------------- ----- ----- ---- -- - ----- -------- - ----- -------------------------- -- -------------------- --- ---- - ----- ----- - --- ------------- -------- ------------------------ ---------------- - ------------------- ----- ----- - ---------- ------- ------------- -- -- ----------------------------- ---- ---- -- - -- --------------- --- ---- - ------------- - ------ -------------- -- - ---- -- --------------- --- ---- - ------------- - ------ ---- -------- -- - ---- - ------------- - ------ --------- ------ ------ -- - --
在此示例中,我们调用了一个名为“got”的API。如果API返回非200代码,则抛出一个新的自定义错误。Fastify.setErrorHandler()将指定一个处理程序,在Fastify捕获特定类型的错误时执行。
在此处理程序中,我们根据错误对象的状态代码属性执行自定义逻辑(但您可以根据需要执行任何逻辑)。这使我们能够处理特殊类型的错误,并为应用程序的下一个访问者提供更好的体验。
结论
在这篇文章中,我们详细介绍了Fastify框架的异常处理机制,并提供了一些示例代码来帮助您更好地理解它们的使用。如果您将这些机制与其他Fastify的优点结合使用,例如性能和低开销,那么您的应用程序将变得更加灵活和可靠,更容易维护。因此,我们建议您进行一些健全的尝试,以确定您的应用程序是否可以从这些机制中受益。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/670316bdd91dce0dc849a51c