You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 07:22:00