自定义错误处理
Fastify 提供灵活的机制来自定义错误处理流程,包括全局错误钩子、Schema 校验错误格式化、以及手动抛出业务错误等。
全局错误处理钩子
使用 setErrorHandler 方法可以统一处理所有未捕获的错误:
fastify.setErrorHandler((error, request, reply) => {
request.log.error(error); // 打印日志
reply.status(error.statusCode || 500).send({
error: true,
message: error.message
});
});
该方法适用于:
- 请求处理函数中未捕获的异常
- Schema 校验失败
- 插件内部抛出的异常
Schema 校验错误格式化
你可以通过 setValidatorCompiler 和 setSchemaErrorFormatter 来自定义校验器和错误格式:
fastify.setSchemaErrorFormatter((errors, dataVar) => {
return new Error(`校验失败:${errors[0].message}`);
});
默认情况下,Fastify 使用 AJV 生成详细的校验错误信息。
手动抛出 HTTP 错误
Fastify 提供 fastify.httpErrors 工具对象,可快速抛出带状态码的错误:
fastify.get('/auth', async (request, reply) => {
throw fastify.httpErrors.unauthorized('未登录或 Token 无效');
});
常见方法有:
badRequest()unauthorized()forbidden()notFound()internalServerError()
局部错误处理(每个路由)
每个路由也可以设置独立的错误处理函数:
fastify.get('/user', {
handler: async () => {
throw new Error('故意抛错');
},
errorHandler: (error, request, reply) => {
reply.status(400).send({ msg: '自定义错误信息' });
}
});
日志控制
可结合 request.log 输出结构化错误日志,方便排查:
fastify.setErrorHandler((error, request, reply) => {
request.log.warn({ err: error }, '请求出错');
reply.status(500).send({ msg: '服务器内部错误' });
});
相关内容
- Fastify 与 Express 对比 本节将对 Fastify 和 Express 两个流行的 Node.js 框架进行对比,帮助开发者理解它们的异同以及在不同场景下的选择。
- 中间件迁移指南 本节介绍如何在 Fastify 中迁移中间件,帮助开发者从其他框架(如 Express)迁移到 Fastify,理解 Fastify 中间件的工作方式,并学习如...
- 常用插件清单 本节列出了一些常用的 Fastify 插件,帮助开发者更好地扩展和定制 Fastify 应用。
- 核心 API 介绍 介绍 Fastify 中常用的核心 API,包括路由注册、请求与响应对象、日志等。
- Hello World 快速上手 Fastify,编写第一个 “Hello World” 应用,体验其简洁的 API 和高性能启动。
- 请求与响应对象 详解 Fastify 中的 request 和 reply 对象,用于获取请求信息和构造响应。