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

