如何去除Strapi返回JSON中的冗余数组与嵌套对象?
解决Strapi API响应嵌套问题的方法
方法一:重写自定义控制器(推荐)
Strapi不建议直接修改自动生成的schema.json文件,正确的做法是通过重写控制器来格式化响应数据,步骤如下:
- 找到文章模型的控制器文件,路径一般为
src/api/article/controllers/article.js - 重写
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; } }));
- 重启Strapi服务后,请求文章API即可得到期望的扁平化格式。
方法二:全局响应中间件(多模型通用)
如果需要多个模型的API都使用扁平化响应,可以通过全局中间件统一处理:
- 创建中间件文件
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); } } }; };
- 在
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' ];
- 重启Strapi后,所有API响应都会自动完成扁平化处理。
注意事项
- 禁止直接修改Strapi自动生成的
schema.json,该文件会随模型配置修改被自动覆盖,错误修改还会导致API崩溃。 - 若需要保留分页、总数等meta信息,可在控制器中返回
{ data: formattedData, meta }结构。
内容的提问来源于stack exchange,提问作者starbvuks
相关产品推荐
相关产品推荐

