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
相关产品推荐
相关产品推荐

