Fastify 是一个高效、低开销的 Node.js web 框架。在处理 web 请求的过程中,不可避免地会发生错误。如何优雅地处理错误对于应用程序的稳定性至关重要。接下来我们将介绍在 Fastify 中如何处理错误,以便更好地利用 Fastify 的优势。
捕获错误
在 Fastify 中捕获错误有两种方式:通过 try/catch
或使用 Fastify 错误处理器。使用 try/catch
是一种更直接的方式,可以在路由处理函数中添加:
fastify.get('/error', async (request, reply) => { try { throw new Error('Oops!'); } catch (err) { reply.status(500).send(err); } });
当错误被抛出并且被捕获时,状态码被设置为 500,响应内容是错误信息。为了实现更优雅的错误处理,我们可以使用 Fastify 的错误处理器。
错误处理器
Fastify 错误处理器允许我们在一处统一处理所有路由中的错误。在我们的应用程序中注册错误处理器:
fastify.setErrorHandler(async (error, request, reply) => { console.error(error.stack); reply .code(500) .header('Content-Type', 'application/json; charset=utf-8') .send({ message: 'Internal server error' }); });
这个错误处理器将在所有路由中的错误中调用。回调函数接受三个参数:错误对象 error
,请求对象 request
,以及响应对象 reply
。
注意:这个错误处理器只能处理使用 next
函数抛出的错误,throw
抛出的错误需要在路由处理函数中 try/catch
捕获。
接下来,我们可以将我们的路由处理函数简化:
fastify.get('/error', async (request, reply) => { throw new Error('Oops!'); });
next
函数会抛出一个错误,错误处理器会捕获错误并给出响应。这保证了任何路由中的错误都会由错误处理器处理。
错误日志记录
在生产环境中日志记录是必须的,为了更好地跟踪错误发生的位置。Fastify 的错误处理器提供了一个简单的方法来记录错误,我们可以在错误处理器中添加一条 log:
fastify.setErrorHandler(async (error, request, reply) => { console.error(`[${new Date().toISOString()}] ${request.method} ${request.url} - ${error.stack}`); reply .code(500) .header('Content-Type', 'application/json; charset=utf-8') .send({ message: 'Internal server error' }); });
这将记录每个错误的请求信息和错误栈。
自定义错误
处理错误不仅仅是返回错误信息和错误码。有时候,我们需要在响应体中包含更多信息,比如一些自定义错误码或者错误提示。Fastify 允许我们自定义错误并在错误处理器中使用。为了实现这个需求,我们需要继承标准的 JavaScript 错误类:
class CustomError extends Error { constructor(message, statusCode) { super(message); this.statusCode = statusCode; } }
我们创建了一个继承 Error
的类 CustomError
,并添加了 statusCode
属性。
接下来我们可以使用这个类创建自定义的错误:
fastify.get('/custom-error', async (request, reply) => { const err = new CustomError('Oops! Something went wrong', 500); throw err; });
此时,在错误处理器中使用:
fastify.setErrorHandler(async (error, request, reply) => { console.error(`[${new Date().toISOString()}] ${request.method} ${request.url} - ${error.stack}`); reply .code(error.statusCode || 500) .header('Content-Type', 'application/json; charset=utf-8') .send({ message: error.message }); });
现在,在错误处理器返回的响应体中,我们的自定义 statusCode
和错误信息都被包含了进去。
结论
在 Fastify 中优雅地处理错误非常简单。我们可以使用 try/catch
或使用错误处理器来捕获错误,为了更好地跟踪错误,在错误处理器中添加日志记录,使用自定义错误来返回更明确的响应。利用这些技巧,我们可以为我们的应用程序提供一个健壮的错误处理机制。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/672047992e7021665e017cb2