如何使用 Graphql 从 Strapi 查询 Gatsby 中的多个图像

2023-12-01

我在 Strapi 上的项目内容类型上设置了一个名为图片的多媒体(图像)字段,并且添加了 2 个项目,每个项目的图片包含 4 张图像。 我想使用 Graphql 在 Gatsby 中查询这些图像。

这是我在 gatsby-config.js 中的插件数组

    plugins: [
    `gatsby-plugin-react-helmet`,
    {
      resolve: `gatsby-source-filesystem`,
      options: {
        name: `images`,
        path: `${__dirname}/src/images`,
      },
    },
    `gatsby-plugin-sharp`,
    `gatsby-transformer-sharp`,
    {
      resolve: `gatsby-plugin-manifest`,
      options: {
        name: `gatsby-starter-default`,
        short_name: `starter`,
        start_url: `/`,
        background_color: `#663399`,
        theme_color: `#663399`,
        display: `minimal-ui`,
        icon: `src/images/gatsby-icon.png`,
      },
    },
    {
      resolve: `gatsby-source-strapi`,
      options: {
        apiURL: `http://localhost:1337`,
        queryLimit: 1000,
        contentTypes: [`project`],
      },
    }]

这是我在 localhost:8000/___graphql 上的 graphql 查询

query MyQuery {
  allStrapiProject {
    nodes {
      pictures {
        formats {
          thumbnail {
            childImageSharp {
              fluid {
                src
              }
            }
          }
        }
      }
    }
  }
}

这就是我得到的结果

   {
  "data": {
    "allStrapiProject": {
      "nodes": [
        {
          "pictures": [
            {
              "formats": {
                "thumbnail": null
              }
            },
            {
              "formats": {
                "thumbnail": {
                  "childImageSharp": {
                    "fluid": {
                      "src": "/static/eb8a7ee6108ecc0e6185aced82c3316b/b4216/167f320a448c2d6ff65acf179ee627e2.jpg"
                    }
                  }
                }
              }
            },
            {
              "formats": {
                "thumbnail": null
              }
            },
            {
              "formats": {
                "thumbnail": null
              }
            }
          ]
        },
        {
          "pictures": [
            {
              "formats": {
                "thumbnail": null
              }
            },
            {
              "formats": {
                "thumbnail": null
              }
            },
            {
              "formats": {
                "thumbnail": null
              }
            },
            {
              "formats": {
                "thumbnail": null
              }
            }
          ]
        }
      ]
    }
  }
}

除一张缩略图外,所有缩略图均包含 null。

我尝试过运行“gatsby clean”,有时即使我在 Strapi 上没有重复的图像,查询输出也会在多个位置具有相同的图像 url。


截至目前,还没有“官方”方式来实现这一目标。但有一种解决方法可以在构建过程中创建自定义节点。对于像下面这样的 graphql 查询

query MyQuery {
  allStrapiPortfolio {
    edges {
      node {
        category {
          images {
            localFile {
              childImageSharp {
                fluid {
                  base64
                  tracedSVG
                  srcWebp
                  srcSetWebp
                  originalImg
                  originalName
                }
              }
            }
          }
        }
      }
    }
  }
}

下面给出的代码创建localFile之后的节点images。代码应该进去gatsby-node.js.

const { createRemoteFileNode } = require(`gatsby-source-filesystem`);

exports.onCreateNode = async ({ node, actions, store, cache }) => {
  const { createNode, createNodeField } = actions;

  if (node.internal.type !== null && node.internal.type === "StrapiPortfolio") {
    for (const category of node.category) {
      for (const image of category.images) {
        console.log(image);
        const fileNode = await createRemoteFileNode({
          url: "http://localhost:1337" + image.url,
          store,
          cache,
          createNode,
          createNodeId: (id) => image.id.toString(),
        });

        if (fileNode) {
          image.localFile___NODE = fileNode.id;
        }
      }
    }
  }
};

请注意,您必须根据您的需要自定义代码。在我的解决方案中,由于我的数据结构,我使用了两个 for 循环。如果您不确定或只是想检查您的自定义代码是否有效,您只需添加console.log(node)在第一个 if 语句和 a 之前console.log(image)在第二个 for 循环之后(在我的例子中)。这应该会告诉你你的数据结构以及你应该以何种方式继续。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 Graphql 从 Strapi 查询 Gatsby 中的多个图像 的相关文章

随机推荐

  • 不是 CSS 选择器

    是否有某种 非 CSS 选择器 例如 当我在 CSS 中编写以下行时 带有 class 的标签内的所有输入字段班级名称将有红色背景 classname input background red 如何选择带有类的标签外部的所有输入字段班级名称
  • 如何创建用列表初始化的构造函数?

    如何使用包含 n 个元素的列表初始化构造函数 X x 4 5 6 对于包含 n 个元素的列表 您需要使用 std initializer list Initializer list 对象会像数组一样自动构造 分配了 T 类型的元素 其中的每
  • Angular 路由器 3 通配符匹配

    以下路由配置有什么问题 我总是被导航到 即使有一条路线app jungle import bootstrap from angular platform browser dynamic import RouterConfig provide
  • 阻止使用 .htaccess 访问 php 文件(文件夹),XMLHttpRequest 除外

    我有一个文件夹www mysite com page panel soascripts 其中有 10 个不同的 PHP 文件 我想阻止访问该文件夹脚本以及其中的 php 文件 除了X Requested With XMLHttpReques
  • 即使在获得开发人员许可证后,Visual Studio 2013(XAML?)设计器也会在所有 Windows Phone 项目上崩溃

    我的设计师开始崩溃 即使是在干净的项目上 错误信息如下 System Exception Package failed updates dependency or conflict validation Windows cannot ins
  • 与 SQL Server 建立连接时发生网络相关或特定于实例的错误

    我在网络服务器上托管我的 ASP NET 网站 但是上传后当我尝试访问我的网站时 http www vbi volvobusesindia com 然后出现以下错误 与网络相关或特定于实例的 建立时发生错误 连接到 SQL Server 服
  • 在python中生成真正的随机数[重复]

    这个问题在这里已经有答案了 Python函数生成真随机数 By true随机数也意味着每次运行 python 时生成的种子都是不同的 我该怎么做呢 生成随机数的方法有很多种 但有一个共同点 它们都需要外部输入 假设您使用像游戏一样的简单 R
  • 从 DOCX 中提取表

    我在使用 OpenXML C 解析 docx 文档时遇到一个问题 所以 这是我的步骤 1 加载 docx文档2 接收段落列表3 在每个段落中查找文本 图像和表格元素4 为每个文本和图像元素创建 html 标签5 将输出保存为 html 文件
  • Facebook 登录 - 停留在白色网页 SWIFT

    在我的 LoginViewController 中 我实现了 FBSDKLoginButtonDelegate 并导入了 FBSDKLoginKit 和 FBSDKCoreKit 我在 viewDidLoad 中的代码如下所示 settin
  • 如何在 Perl 中将文件创建时间与当前时间进行比较?

    我想比较 Perl 中的当前时间和文件创建时间 但两者的格式不同 本地时间的格式如下 22116291110813630 文件创建时间是 Today December 29 2008 2 38 37 PM 我如何比较哪个更大以及它们的差异
  • JQuery UI 选项卡 - 清除缓存选项卡

    我在给定页面上有一组 JQuery UI 选项卡 并将它们的缓存属性设置为 true 以减少发出的请求数量 我在选项卡之外还有一个选择列表 用于为加载选项卡的请求提供参数 问题 如果用户单击所有选项卡并加载所有选项卡 然后从选择列表中选择不
  • 使用 Timber (WordPress) 定位特定页面模板

    我正在尝试使用 Timber 文件 twig 在特定页面上输出一些 HTML 内容 我已经能够在主页上输出内容 但不能在特定页面上输出内容 我尝试了以下代码 if fn is page proprietes h5 class widget
  • PHP 关联数组中的项目不能以数字方式(即通过索引)访问吗?

    我试图理解为什么在我的带有查询字符串的页面上 代码 echo Item count count GET echo First item GET 0 结果是 项目数 3 第一项 PHP 关联数组是否与数值数组不同 因此它们的项无法通过索引访问
  • 无法在heroku上进行RDS查询

    我可以毫无问题地访问本地计算机上的 RDS postgresql 数据库 设置 py DATABASES default ENGINE django db backends postgresql psycopg2 NAME xxxxxxx
  • 使用 C# 在一个单元格中实现多种格式

    我想在工作簿的一个单元格中包含多种格式类型 例如我希望我的 A1 单元格显示 Name Aaron Kruger 当我以编程方式将名字 Aaron Kruger 添加到模板中时 它会自动使其变为粗体 所以它看起来像这样 姓名 亚伦 克鲁格
  • 在 Python 中使用 %f 和 strftime() 来获取微秒

    我正在尝试使用 strftime 达到微秒精度 这似乎可以使用 f 如所述here 但是 当我尝试以下代码时 import time import strftime from time print strftime H M S f 我得到了
  • 为什么 PHP 回显的文本会丢失格式?

    有什么想法为什么来自数据库的格式化文本在 php 中回显时会丢失其格式 即没有新行 谢谢 Use nl2br 浏览器会忽略新行 这就是为什么您看到的所有文本都没有换行符 nl2br 将新行转换为 br 在浏览器中显示为新行的标签 如果您想在
  • 从移动浏览器打开时的 URL 重定向/重写

    我们正在开发两个网站 一个是网络应用程序 另一个是移动应用程序 所以我的要求是创建一个重定向 URL 以供移动用户从 Web 应用程序重定向到移动应用程序 但文件夹或结构不同 对于 Web 应用程序来说是http testrequest c
  • Android 屏幕上有多个 Activity?

    所以问题是我需要创建一个屏幕 其中有一个地图和一个列表 但要拥有地图 我有 public class MyMapActivity extends MapActivity 我有一个清单 class MyListActivity extends
  • 如何使用 Graphql 从 Strapi 查询 Gatsby 中的多个图像

    我在 Strapi 上的项目内容类型上设置了一个名为图片的多媒体 图像 字段 并且添加了 2 个项目 每个项目的图片包含 4 张图像 我想使用 Graphql 在 Gatsby 中查询这些图像 这是我在 gatsby config js 中