strapi 版本 4 展平复杂的响应结构

问题描述 投票:0回答:2

使用此函数来扁平化版本 4 上从 strapi 返回的响应。帮助您摆脱数据和属性特性

这将为您提供与 strapi 版本 3 相同的响应结构。这将帮助您轻松地从版本 3 迁移到版本 4。

如何使用?

  1. 导入文件。
  2. const flattnedData = flattenObj({...data})

注意:这里的数据是从 strapi 版本 4 返回的响应。

export const flattenObj = (data) => {
const isObject = (data) =>
    Object.prototype.toString.call(data) === "[object Object]";
const isArray = (data) =>
    Object.prototype.toString.call(data) === "[object Array]";

const flatten = (data) => {
    if (!data.attributes) return data;

    return {
    id: data.id,
    ...data.attributes,
    };
};

if (isArray(data)) {
    return data.map((item) => flattenObj(item));
}

if (isObject(data)) {
    if (isArray(data.data)) {
    data = [...data.data];
    } else if (isObject(data.data)) {
    data = flatten({ ...data.data });
    } else if (data.data === null) {
    data = null;
    } else {
    data = flatten(data);
    }

    for (const key in data) {
       data[key] = flattenObj(data[key]);
    }

    return data;
}

return data;
};
json graphql response apollo-client strapi
2个回答
1
投票

在我的例子中,我在“middlewares”文件夹中创建了一个新的中间件“flatten-response.js”。

function flattenArray(obj) {
  return obj.map(e => flatten(e));
}

function flattenData(obj) {
  return flatten(obj.data);
}

function flattenAttrs(obj) {
  let attrs = {};
  for (var key in obj.attributes) {
    attrs[key] = flatten(obj.attributes[key]);
  }
  return {
    id: obj.id,
    ...attrs
  };
}

function flatten(obj) {
  if(Array.isArray(obj)) {
    return flattenArray(obj);
  }
  if(obj && obj.data) {
    return flattenData(obj);
  }
  if(obj && obj.attributes) {
    return flattenAttrs(obj);
  }
  for (var k in obj) {
    if(typeof obj[k] == "object") {
      obj[k] = flatten(obj[k]);
    }
  }
  return obj;
}

async function respond(ctx, next) {
  await next();
  if (!ctx.url.startsWith('/api')) {
    return;
  }
  ctx.response.body = flatten(ctx.response.body.data)
}

module.exports = () => respond;

我在“config/middlewares.js”中调用它

    module.exports = [
  /* ... Strapi middlewares */
  'global::flatten-response' // <- your middleware,
  'strapi::favicon',
  'strapi::public',
];

0
投票

有一个插件叫strapi-plugin-transformer

我们可以配置为从响应的 JSON 中删除“属性”和“数据”键,您也可以配置要转换的 API。

您可以在 strapi.io 上查看:strapi-plugin-transformer

© www.soinside.com 2019 - 2024. All rights reserved.