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

如何去除Strapi返回JSON中的冗余数组与嵌套对象?

解决Strapi API响应嵌套问题的方法

方法一:重写自定义控制器(推荐)

Strapi不建议直接修改自动生成的schema.json文件,正确的做法是通过重写控制器来格式化响应数据,步骤如下:

  1. 找到文章模型的控制器文件,路径一般为src/api/article/controllers/article.js
  2. 重写find(列表请求)和findOne(单条数据请求)方法,手动处理数据扁平化:
// src/api/article/controllers/article.js
'use strict';

const { createCoreController } = require('@strapi/strapi').factories;

module.exports = createCoreController('api::article.article', ({ strapi }) => ({
  // 处理文章列表请求
  async find(ctx) {
    // 调用默认逻辑获取原始数据
    const { data, meta } = await super.find(ctx);
    
    // 扁平化每条数据结构
    const formattedData = data.map(item => {
      // 合并id与attributes内的字段
      const flatItem = { id: item.id, ...item.attributes };
      // 处理user关联数据的扁平化
      if (flatItem.user?.data) {
        flatItem.user = { 
          id: flatItem.user.data.id, 
          ...flatItem.user.data.attributes 
        };
      }
      return flatItem;
    });
    
    // 返回格式化后的数据(如需保留分页meta,可返回{ data: formattedData, meta })
    ctx.body = formattedData;
  },

  // 处理单篇文章请求
  async findOne(ctx) {
    const { data, meta } = await super.findOne(ctx);
    
    const flatItem = { id: data.id, ...data.attributes };
    if (flatItem.user?.data) {
      flatItem.user = { 
        id: flatItem.user.data.id, 
        ...flatItem.user.data.attributes 
      };
    }
    
    ctx.body = flatItem;
  }
}));
  1. 重启Strapi服务后,请求文章API即可得到期望的扁平化格式。

方法二:全局响应中间件(多模型通用)

如果需要多个模型的API都使用扁平化响应,可以通过全局中间件统一处理:

  1. 创建中间件文件src/middlewares/format-response.js:
'use strict';

module.exports = (config, { strapi }) => {
  return async (ctx, next) => {
    await next();
    
    // 仅处理API响应中的data字段
    if (ctx.response.body?.data) {
      // 定义通用扁平化函数
      const flattenEntry = (entry) => {
        if (!entry) return null;
        const flatEntry = { id: entry.id, ...entry.attributes };
        
        // 自动遍历处理所有关联字段
        Object.keys(flatEntry).forEach(key => {
          // 处理单关联数据
          if (flatEntry[key]?.data && typeof flatEntry[key].data === 'object' && !Array.isArray(flatEntry[key].data)) {
            flatEntry[key] = flattenEntry(flatEntry[key].data);
          } 
          // 处理多关联数据(按需启用)
          else if (flatEntry[key]?.data && Array.isArray(flatEntry[key].data)) {
            flatEntry[key] = flatEntry[key].data.map(flattenEntry);
          }
        });
        
        return flatEntry;
      };
      
      // 适配列表或单条数据的格式化
      if (Array.isArray(ctx.response.body.data)) {
        ctx.response.body = ctx.response.body.data.map(flattenEntry);
      } else {
        ctx.response.body = flattenEntry(ctx.response.body.data);
      }
    }
  };
};
  1. 在config/middlewares.js中注册该中间件:
module.exports = [
  'strapi::errors',
  'strapi::security',
  'strapi::cors',
  'strapi::poweredBy',
  'strapi::logger',
  'strapi::query',
  'strapi::body',
  'strapi::session',
  'strapi::favicon',
  'strapi::public',
  // 加入自定义中间件
  'global::format-response'
];
  1. 重启Strapi后,所有API响应都会自动完成扁平化处理。

注意事项

  • 禁止直接修改Strapi自动生成的schema.json,该文件会随模型配置修改被自动覆盖,错误修改还会导致API崩溃。
  • 若需要保留分页、总数等meta信息,可在控制器中返回{ data: formattedData, meta }结构。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 20:16:11