Strapi api 响应中未包含的组件

San*_*ain 29 headless content-management-system strapi

我今天决定使用 Strapi 作为我的作品集的无头 CMS,但我遇到了一些问题,我似乎无法在网上找到解决方案。也许我太无能,无法真正找到真正的问题。

我已经为我的项目设置了一个模式,该模式将存储在 Strapi 中(所有内容都在网络中完成),但是我的自定义组件遇到了一些问题,也就是说,当我运行时它们不是 API 响应的一部分通过邮递员。(不仅仅是空键,而且根本不包含在响应中)。所有其他字段(不是组件)均按预期填写。

起初我认为这可能与权限有关,但一切都已启用,所以不可能是这样,我还尝试查看代码中的 API,但记录的答案也不包含组件。

这是架构中一些字段的图像,但更重要的是响应中未包含的组件。

一些领域

所以我的问题是,我是否需要在项目中创建某种解析器或任何内容才能包含这些字段,或者为什么不包含它们?

Ice*_*nas 62

我遇到了同样的问题,并且能够通过将 populate=* 添加到 API 端点的末尾来修复它。

例如:

http://localhost:1337/api/test?populate=*
Run Code Online (Sandbox Code Playgroud)

更多信息请参见:https://forum.strapi.io/t/cannot-see-media-field-in-my-endpoint-for-my-content-type/13082/2

编辑:仅使用 populate=* 填充第一级关系。使用 LHS 括号语法(即 [populate]=*)进行更深层次的填充:

例如:

http://localhost:1337/api/test?populate[TestExamples][populate]=*
Run Code Online (Sandbox Code Playgroud)

如果您转到关系人口,请在此处了解更多信息:https://docs.strapi.io/developer-docs/latest/developer-resources/database-apis-reference/rest-api.html#fields-selection


小智 8

只是为了添加已接受的答案,如果您正在使用大量嵌套集合或嵌套组件(例如在单一类型中使用大量自定义组件),那么编写自定义控制器可能是值得的。

我需要渲染一个具有“标题”组件的主页,并且标题有两个可重复的嵌套“按钮”组件。此外,我想呈现一对多关系的“客户端”集合。

由于这个数据结构不会经常改变,所以我刚刚编写了一个自定义控制器,所以我不必在前端担心这个问题。

假设您已经创建了一个主页单一类型来呈现您的主页,控制器将在以下目录中可用:/src/api/homepage/controllers/homepage.js

在下面的示例中,我想渲染Header具有嵌套的组件header_image和具有嵌套集合的buttons组件。Clientsclients

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

module.exports = createCoreController('api::homepage.homepage', ({ strapi }) => ({
    async find(ctx) {
        const populateList = [
            'Header.header_image',
            'Header.buttons',
            'Clients.clients'
        ]
        // Push any additional query params to the array
        populateList.push(ctx.query.populate)
        ctx.query.populate = populateList.join(',')

        const content = await super.find(ctx)
        return content
    }
}));
Run Code Online (Sandbox Code Playgroud)

Strapi V3 和 V4 之间似乎存在显着差异,我发现 V4 中有关填充嵌套组件的文档相当差。我想这将在接下来的几周内更新,因为 Strapi V4 才刚刚发布。

如果有更好的方法来填充深层嵌套的组件或关系,我很乐意听到,但我希望上述内容同时也能帮助一些人。