Strapi 4统计Links集合点赞数时控制器报错:allPosts.find不是函数
Strapi 4 统计每个Link点赞总数时出现
allPosts.find is not a function错误的解决方法 问题描述
我使用Strapi 4,有两个集合:
- 集合1:
links(包含id、body等字段) - 集合2:
likes(包含id、postid、userid字段)
想要统计每个links的id对应的点赞总数,通过控制器实现时出现以下错误:
error: allPosts.find is not a function
TypeError: allPosts.find is not a function
控制器代码如下:
'use strict'; /** * link controller */ const { createCoreController } = require('@strapi/strapi').factories; module.exports = createCoreController('api::link.link', ({ strapi }) => ({ // Method 2: Wrapping a core action (leaves core logic in place) async find(ctx) { const { data, meta } = await super.find(ctx); const linkId = data.map((link) => link.id); //count all like for each post const allPosts = await strapi .db .query('api::like.like') .count({ where: { postid: { $in: linkId }, } }); console.log("nombre de like dif",allPosts); const data2 = data.map((link) => { link.like = allPosts.find( (like) => like.attributes.postid === link.id ); link = {id:link.id, ...link.attributes, like:link.like}; return link; } ); return { data:data2 , meta }; }, }));
错误原因
strapi.db.query('api::like.like').count()方法返回的是单个数字,不是数组。你试图调用数组的find()方法自然会报错。这个方法只会返回符合条件的likes记录总数量,而非分组后的每个link的点赞数。
修复方案
要统计每个link对应的点赞数,需要用分组查询,按postid分组并统计每组的数量:
修改后的控制器代码
'use strict'; /** * link controller */ const { createCoreController } = require('@strapi/strapi').factories; module.exports = createCoreController('api::link.link', ({ strapi }) => ({ async find(ctx) { const { data, meta } = await super.find(ctx); const linkIds = data.map(link => link.id); // 按postid分组统计每个link的点赞数 const likeCounts = await strapi.db.query('api::like.like').findMany({ attributes: ['postid', strapi.db.raw('COUNT(*) as count')], where: { postid: { $in: linkIds } }, groupBy: ['postid'] }); // 将统计结果转为对象,方便快速查找 const likeCountMap = {}; likeCounts.forEach(item => { likeCountMap[item.postid] = item.count; }); // 给每个link添加点赞数 const dataWithLikes = data.map(link => { const likeCount = likeCountMap[link.id] || 0; return { id: link.id, ...link.attributes, like: likeCount }; }); return { data: dataWithLikes, meta }; }, }));
代码说明
- 使用
findMany()配合attributes和groupBy,按postid分组统计每组的点赞数量,得到每个link对应的点赞数数组。 - 将统计结果转为键值对对象
likeCountMap,通过link的id可以直接获取对应的点赞数,提升查找效率。 - 遍历原links数据,给每个link添加对应的点赞数(如果没有点赞则显示0)。
内容的提问来源于stack exchange,提问作者frontcodelover
相关产品推荐
相关产品推荐

