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

使用mongoose.find(req.query)结合实例方法返回数据时触发错误

搞定mongoose实例方法调用报错的问题

嘿,我一眼就瞅出你这儿报错的原因了!你用Callsheet.find(req.query)拿到的是一堆文档组成的数组,但你定义的summary是挂载在单个Callsheet文档实例上的方法——数组根本没这个方法,可不就报错嘛!

下面给你几个实用的解决办法,按需选就行:

办法1:遍历数组,逐个调用实例方法

如果你的summary本来就是处理单个文档的逻辑,那直接遍历返回的callsheets数组,给每个文档单独调用summary()就行:

router.get('/callsheets', authenticate, (req, res) => {
  Callsheet.find(req.query)
    .then(callsheets => {
      // 把每个文档的summary结果攒成新数组返回
      const summarizedList = callsheets.map(sheet => sheet.summary());
      res.send(summarizedList);
    })
    .catch(err => res.json({ err }));
});

办法2:换成Schema静态方法

要是你的summary是针对整个查询结果的汇总逻辑,不如把它改成Schema的静态方法,这样就能直接在模型上调用,处理整个数组:
先改Schema定义:

const CallsheetSchema = new mongoose.Schema({
  // 你的字段都在这儿...
});

// 定义静态方法,接收文档数组做处理
CallsheetSchema.statics.summary = function(documents) {
  // 这里写你针对数组的汇总逻辑,比如格式化、统计啥的
  return documents.map(doc => {
    // 这里可以复用你原来实例方法里的单个文档处理逻辑
    return {
      id: doc._id,
      creator: doc.creator,
      title: doc.title,
      // 其他你需要的汇总字段
    };
  });
};

const Callsheet = mongoose.model('Callsheet', CallsheetSchema);

然后在路由里这么用:

router.get('/callsheets', authenticate, (req, res) => {
  Callsheet.find(req.query)
    .then(callsheets => {
      const summarizedData = Callsheet.summary(callsheets);
      res.send(summarizedData);
    })
    .catch(err => res.json({ err }));
});

额外小技巧:用toJSON自动格式化

要是你的summary只是想调整单个文档的返回格式,那更省心的办法是用mongoose的toJSON转换——这样返回文档的时候会自动帮你处理格式,不用手动调用方法:

CallsheetSchema.methods.toJSON = function() {
  const sheetObj = this.toObject();
  // 自定义你要返回的字段和格式,和summary逻辑一致
  return {
    id: sheetObj._id,
    creator: sheetObj.creator,
    title: sheetObj.title,
    // 其他需要的字段
  };
};

之后路由里直接res.send(callsheets)就会自动应用这个格式,超方便!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:29:36