Gatsby GraphQL 无法在 Strapi 的“文件”类型上查询字段“url”

dun*_*act 2 graphql strapi gatsby

我正在用 Gatsby 前端和 Strapi 后端制作博客。我使用 StaticQuery 在组件中进行了查询

query={graphql`
        query {
          allStrapiArticle {
            edges {
              node {
                strapiId
                title
                category {
                  name
                }
                image {
                  url
                }
              }
            }
          }
        }
      `}
Run Code Online (Sandbox Code Playgroud)

没有image{url}. 我收到错误:error Cannot query field "url" on type "File" graphql/template-strings。我该如何解决?谢谢!

Aga*_*Aga 5

我也遇到过这个问题。Strapi教程建议使用 'url' 进行查询,但这是错误的。

正确的查询方法是:

      allStrapiArticle {
        edges {
          node {
            strapiId
            title
            category {
              name
            }
            image {
              publicURL
            }
          }
        }
      }
Run Code Online (Sandbox Code Playgroud)

为了显示图像,不要忘记像这样将url交换为publicURL

  <img
    src={article.node.image.publicURL}
    alt={article.node.image.publicURL}
    height="100"
  />
Run Code Online (Sandbox Code Playgroud)


Fer*_*reu 3

尽管您已经在 Strapi 中创建了带有字段的图像对象url,但 Strapi + Gatsby 仍会下载它,并且您必须稍微更改一下查询。

此时,您的所有图像都属于gatsby-source-filesystem,因此必须以不同的方式查询它们。当然,您可以获得,url但您的数据结构可能与您在 Strapi 后台创建的数据结构不同。换句话说,您要查找的字段位于另一个对象内部,在这种情况下,该字段publicURL将包含您想要的url值。以下是如何获取一张或多张图像的示例:

    singleImage {
     publicURL
    }
    multipleImages {
      localFile {
        publicURL
      }
    }
Run Code Online (Sandbox Code Playgroud)

参考: https: //github.com/strapi/gatsby-source-strapi

当您在 Playground 下运行 gatsby 开发来测试 GraphQL 查询时,请查看自动完成功能localhost:8000/___graphql,它可能会帮助您获取所需的字段。

本教程还指出了一些有趣的东西。

如果你想使用gatsby-image基于 - 的图像,你可以使用:

  image {
    childImageSharp {
      fluid(maxWidth: 960) {
        ...GatsbyImageSharpFluid
      }
    }
  }
Run Code Online (Sandbox Code Playgroud)

然后它应该在类似的循环中使用(使用gatsby-image用法):

<Img fluid={data.allStrapiArticle.edges[position].index.image.childImageSharp.fluid} />
Run Code Online (Sandbox Code Playgroud)