使用node-cache缓存MongoDB查询时触发this.__parentArray.$path错误
问题原因
你遇到的错误是因为Mongoose的find()方法返回的是Mongoose Document实例,这类对象包含大量内部属性和方法(比如__parentArray、$path),而node-cache在序列化这些对象时,会尝试访问这些内部成员,导致触发this.__parentArray.$path is not a function的错误。
解决方法
核心是把Mongoose文档转换成纯JavaScript对象(POJO)后再存入缓存,有两种常用方式:
方式1:查询时直接返回纯对象(推荐)
在find()后添加.lean()方法,让Mongoose直接返回普通JS对象,而非Document实例:
import NodeCache from "node-cache"; const cache = new NodeCache({ stdTTL: 60, checkperiod: 80 }); export async function checkCache(req, res) { let brands = cache.get("brands"); if (brands == undefined) { try { // 添加.lean()返回纯对象 brands = await brandModel.find({}).lean(); cache.set("brands", brands); res.send({ status: 1000, data: brands, message: "FROM DATA BASE", }); } catch (error) { res.send({ status: 2000, data: null, message: error.message, }); } } else { res.send({ status: 1000, data: brands, message: "From CACHE", }); } }
方式2:将已获取的Document转换为纯对象
如果无法使用lean()(比如需要保留Document的某些方法),可以用toJSON()或toObject()转换后再缓存:
// 替换cache.set那一行 cache.set("brands", brands.map(doc => doc.toJSON())); // 或者用toObject() cache.set("brands", brands.map(doc => doc.toObject()));
补充说明
.lean()是性能最优的方案,它避免了Mongoose创建Document实例的开销,同时直接生成可缓存的纯对象。- 如果缓存的对象需要后续修改并保存回数据库,不要用
lean(),此时应该用toObject()转换后缓存,或者考虑不缓存Document实例。
内容的提问来源于stack exchange,提问作者Mohammed Riyadh
相关产品推荐
相关产品推荐

