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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 20:17:18