如何选择性地查询 gatsby Contentful Rich Text 中的引用?

Posted

技术标签:

【中文标题】如何选择性地查询 gatsby Contentful Rich Text 中的引用?【英文标题】:How to optionally query references in gatsby Contentful Rich Text? 【发布时间】:2021-10-24 03:49:09 【问题描述】:

我正在尝试创建一个博客页面,该页面可以选择显示任何存在的图像资产。

首先,我在 Contentful 中使用名为“Body”的富文本创建了一个内容模式,然后我创建了一个包含一些随机文本的条目。在 Gatsby 中,当我尝试通过 GraphQL explorer 查询数据时,我可以查询“body”中的“raw”字段。除非我添加至少一个图像资产(又名“虚拟内容”),否则无法查询“引用”字段。

下面是我的 graphql 查询

export const query = graphql`
  query ($slug: String!) 
    contentfulBlog(slug:  eq: $slug , node_locale:  eq: "en-US" ) 
      title
      body 
        raw
        references 
          ... on ContentfulAsset 
            contentful_id
            __typename
            gatsbyImageData(formats: AUTO, layout: FULL_WIDTH)
          
        
      
    
  
`

上述查询的问题是,如果在帖子中没有找到图片资源,则会中断查询。我的目标是能够在有可用资产时选择性地查询引用字段。但我不知道该怎么做。

**2021 年 8 月 24 日更新:

对于今天还在为这个问题苦苦挣扎的任何人: 在挖掘了大量文档和答案后,我发现这实际上是 gatsby-source-contentful 插件的限制之一。简而言之,插件(v4),正如它在其documentation 中所述:

目前,没有至少一个填充实例的字段 不会在 GraphQL 架构中创建。

不确定是否会在未来的版本中解决此问题,但目前,需要在富文本正文中添加至少一个虚拟内容(嵌入图像、链接...等)才能使插件在 graphql 架构中创建“references”字段。

这里是官方discussion thread

【问题讨论】:

【参考方案1】:

如果这个想法是只查询references 是否可用,您需要customize the GraphQL schema 使该字段可以为空(意味着它可以为空,null),因为默认情况下,推断它不是' t.

您可以检查内容类型:https://www.contentful.com/developers/docs/references/content-delivery-api/#/reference/content-types/content-model

这将是理想的解决方案。或者,根据此Medium article,您可以通过将违规节点包装在节点类型对象中来绕过它。在你的情况下:

export const query = graphql`
  query ($slug: String!) 
    contentfulBlog(slug:  eq: $slug , node_locale:  eq: "en-US" ) 
      title
      body 
        raw
        references 
          ... on Node 
            ... on ContentfulAsset 
              contentful_id
              __typename
              gatsbyImageData(formats: AUTO, layout: FULL_WIDTH)
            
          
        
      
    
  
`

您可能需要对其进行调整。在不了解您的数据和架构结构的情况下,无法猜测上面的查询是否会单独工作,但请理解。在 GrahiQL 操场上查看 (localhost:8000/___graphql)

其他资源:

https://github.com/gatsbyjs/gatsby/issues/20696 https://github.com/gatsbyjs/gatsby/pull/20794

【讨论】:

感谢您的帮助!非常感谢!

以上是关于如何选择性地查询 gatsby Contentful Rich Text 中的引用?的主要内容,如果未能解决你的问题,请参考以下文章

使用 PostCSS 和 TailwindCSS 构建 Gatsby 站点时出错

Gatsby / Drupal8 解耦:如何在从 Drupal 文件目录中提取的 Gatsby 页面上呈现图像?

如何查询 gatsby-image?

如何改进对特定图像的 gatsby 图像查询

如何在 Gatsby 中对 GraphQL 查询进行单元测试

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