【问题标题】:Angular 11 Apollo graphql - WARNING: heuristic fragment matching going on! - Missing Field WarningAngular 11 Apollo graphql - 警告:启发式片段匹配正在进行! - 缺少字段警告
【发布时间】:2022-07-29 02:52:01
【问题描述】:

我正在调用一个 API,其中一个字段是可选的,对于某些记录,它不会存在,因此它不会返回,例如:

...
media_gallery {
    url
    label,
    ... on ProductVideo {
         video_content {
          video_url
       }
    }
 } 
 ...

在这种情况下,video_content 对象的某些记录将不会返回。我已经在网上搜索并应用了各种可能的修复方法,但不是运气,一种是片段和可能的类型 ref:https://www.apollographql.com/docs/react/data/fragments/#fragment-matcher,应用所有这些都没有错误,但问题仍然存在。

有人知道如何让 apollo 明白这个字段是可选的吗?

谢谢

【问题讨论】:

  • 片段用于组合来自图表不同部分的数据(例如,如果 ProductVideo 是另一种类型的子集)。您的图表应该返回通过解析器返回的任何可用值,唯一的要求是使架构中的字段可以为空。如果您分享重现问题的可重现步骤,则可能还会分享其他建议。

标签: graphql apollo apollo-client angular11


【解决方案1】:

要使用片段,首先定义每个类型实现的接口来表示它们的关系。举个小例子:

"Represents media_gallery's common attributes"
interface media_gallery {
  url: String!
  "The media_gallery url"
  label: String!
  "The media_gallery label"
}

实现类型需要包括这些字段和返回类型,以及它们需要的新字段:

type ProductVideo implements media_gallery {
  url: String!
  "The media_gallery URL"
  label: String!
  "The media_gallery label"
  video_content: String!
  "Product Video's description"
  video_url: String!
  "URL to the Product Video"
}

一旦定义了这些,创建必要的解析器来确定哪个类型与返回的接口实现相匹配。从那里,可以添加片段组合:

"Declared fragment"
query getMediaGallery {
  media_gallery {
    url
    label
    ...ProductVideoContent
  }
}

fragment ProductVideoContent on ProductVideo {
  video_content {
    video_url
  }
}

"Inline fragment"
query getMediaGallery {
  media_gallery {
    url
    label
    ... on ProductVideo {
      video_content {
        video_url
      }
    }
  }
}

关于使用片段的一些额外资源: Apollo Odyssey tutorial for Intermediate Schema Design, dev doc on semantically meaningful interfaces, Using fragments with unions and interfaces.

【讨论】:

    猜你喜欢
    • 2018-06-08
    • 2020-04-28
    • 2020-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-05
    • 2013-02-23
    • 2020-12-14
    相关资源
    最近更新 更多