Fastify setErrorHandler无法返回完整JSON,求正确实现代码
解决Fastify setErrorHandler序列化错误的方案
当你在自定义错误处理器中返回包含error结构的完整JSON时出现FST_ERR_FAILED_ERROR_SERIALIZATION,本质是Fastify默认的错误序列化逻辑干扰了自定义响应的输出。以下是正确的实现方式:
核心要点
- 确保发送的是普通JavaScript对象而非Error实例
- 手动指定响应状态码(可选,但推荐)
- 避免依赖Fastify默认的错误序列化,直接构造响应内容
正确代码示例
const fastify = require('fastify')({ logger: true }); // 自定义错误处理器 fastify.setErrorHandler((error, request, reply) => { // 构造自定义错误响应结构 const customErrorResponse = { ok: false, error: { code: error.code || 'UNKNOWN_ERROR', message: error.message || 'An unexpected error occurred', details: error.details || null } }; // 设置响应状态码(根据实际错误类型调整,比如400/500等) const statusCode = error.statusCode || 500; // 发送自定义响应,直接传普通对象即可 reply.code(statusCode).send(customErrorResponse); }); // 测试路由 fastify.get('/test-error', async (request, reply) => { // 模拟抛出错误 throw new Error('Invalid request parameters'); }); // 启动服务 fastify.listen({ port: 3000 }, (err) => { if (err) { fastify.log.error(err); process.exit(1); } });
额外说明
- 如果你的错误是自定义Error类实例,要确保它的属性(如code、details)是可枚举的,否则序列化时会丢失
- 若不需要Fastify默认的错误日志,可在处理器中添加
reply.log.error(error)手动控制日志输出 - 绝对不要直接返回Error对象,必须转为普通JSON结构再发送
内容的提问来源于stack exchange,提问作者roni naruka
相关产品推荐
相关产品推荐

