FeathersJS中Mongoose的getter、toJSON转换在get/find时不触发如何解决
核心原因
FeathersJS 官方 Mongoose 适配器默认开启 lean: true 全局查询配置,该模式下 Mongoose 会直接返回纯 JavaScript 对象,不会实例化完整的 Mongoose 文档,因此不会触发任何 Schema 定义的字段 getter、toJSON.transform 转换逻辑。
完整修复步骤
1. 修正 Schema 配置
首先需要在 Schema 选项中主动开启 toJSON.getters 配置,确保序列化时会应用字段级 getter,同时 transform 函数必须返回修改后的结果对象:
const schema = new Schema({ imageId: { type: String, get: (v) => { console.log('Here'); return v; } }, }, { timestamps: true, toJSON: { getters: true, // 必加:开启toJSON序列化时的字段getter应用 transform: (doc, ret, options) => { console.log('Here too'); // 必须返回处理后的ret对象,否则序列化结果为空 return ret; } } });
2. 根据需求选择适配方案
方案一:关闭服务的全局lean查询(最稳妥,适用于大多数场景)
注册 Mongoose 服务时,将 lean 配置设为 false,强制返回完整 Mongoose 文档实例:
app.use('/your-service-path', service({ Model: yourMongooseModel, lean: false, // 关闭默认lean查询 // 其余服务配置 }))
方案二:保留lean查询性能,适配lean场景下的getter触发
如果需要保留lean查询的高性能,可在Schema中额外添加lean场景的getter配置:
const schema = new Schema({ imageId: { type: String, get: (v) => { console.log('Here'); return v; } }, }, { timestamps: true, toJSON: { getters: true, transform: (doc, ret, options) => { console.log('Here too'); return ret; } }, // 新增lean场景下的getter配置 toObject: { getters: true }, lean: { getters: true } });
注意事项
- 如果仅需要特定接口触发转换逻辑,可在Feathers的before hook中单独配置
context.params.lean = false,无需全局关闭lean - 若使用了Feathers的schema解析钩子(如
@feathersjs/schema的resolve方法),需确保钩子执行顺序在Mongoose文档序列化之后,避免覆盖转换结果 - 全局关闭lean会轻微降低大批量数据查询的性能,高并发大数据场景建议按需配置
内容的提问来源于stack exchange,提问作者Corentin M
相关产品推荐
相关产品推荐

