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

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 };
  },
}));

代码说明

  1. 使用findMany()配合attributes和groupBy,按postid分组统计每组的点赞数量,得到每个link对应的点赞数数组。
  2. 将统计结果转为键值对对象likeCountMap,通过link的id可以直接获取对应的点赞数,提升查找效率。
  3. 遍历原links数据,给每个link添加对应的点赞数(如果没有点赞则显示0)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 14:33:19