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

Fastify返回非空对象但客户端收到空响应问题排查

问题根因

响应返回空对象核心原因是构造返回值时取用的是Mongoose Document实例的属性,这类属性由Mongoose通过getter挂载,不属于普通JavaScript对象的自有可枚举属性:

  • 控制台打印Mongoose文档时会触发其自定义inspect逻辑,能展示完整属性值,和实际序列化行为不一致,因此会出现打印结果正常、接口返回为空的现象
  • Fastify内部做响应序列化时仅处理对象的自有可枚举属性,同时无法自动识别转换ObjectId这类Mongoose自定义类型,最终序列化结果为空对象
    如果路由配置了响应schema,schema未声明的字段会被Fastify自动过滤,也会导致返回内容缺失。
修复方案

二选一即可:

  • 调用Mongoose内置方法把文档实例转成普通对象,修改src/Handlers/Professor.handler.js的返回逻辑:
await professor.save();
await professor.generateToken();
// 先转普通对象,再做字段裁剪
const profData = professor.toObject();
return {
  firstName: profData.firstName,
  lastName: profData.lastName,
  _id: profData._id.toString(), // ObjectId转字符串,避免序列化异常
  tokens: profData.tokens,
};
  • 手动做类型转换,剥离Mongoose的代理属性:
await professor.save();
await professor.generateToken();
return {
  firstName: String(professor.firstName),
  lastName: String(professor.lastName),
  _id: professor._id.toString(),
  tokens: Array.from(professor.tokens)
};

如果配置了响应schema,记得补充professor对象下firstName/lastName/_id/tokens字段的声明,避免字段被默认过滤。

内容的提问来源于stack exchange,提问作者Cookie

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 10:21:25