【问题标题】:graphql filter based on internal fragments (gatsbyJS)基于内部片段的graphql过滤器(gatsbyJS)
【发布时间】:2020-07-28 08:43:20
【问题描述】:

为什么这不可能?从某种意义上说,我似乎无法访问通过内部片段访问的任何属性,例如 ... on File

codebox 来自gatsby-docs

{
  books: allMarkdownRemark(filter: {parent: {sourceInstanceName: {eq: "whatever"}}}) {
    totalCount
    edges {
      node {
        parent {
          ... on File {
            sourceInstanceName
          }
        }
      }
    }
  }
}

错误:字段不是由类型 NodeFilterInput 定义的

【问题讨论】:

    标签: graphql gatsby


    【解决方案1】:

    这是解析器作者的责任。

    您可以将其与一般函数参数和返回结果进行比较。在 graphQL 中,两者都是严格定义/类型化的。

    在这种情况下,对于查询allMarkdownRemark,您有

    allMarkdownRemark(
      filter: MarkdownRemarkFilterInput
      limit: Int
      skip: Int
      sort: MarkdownRemarkSortInput
    ): MarkdownRemarkConnection!
    

    ...所以可能的参数只有filter、limit、skip 和sort。参数 filter 也定义了形状 - 它必须是 MarkdownRemarkFilterInput 类型。您只能将在此类型中定义的属性用于 filter 参数。

    这是设计使然,这就是设计师创建解析器的方式以及他对如何处理以及处理哪些参数的意图。

    这就像分页 - 您不必使用任何结果字段作为参数,因为 skip 和 limit 用于记录级别。这样,这些参数根本与字段无关。它们用于解析器中的某些逻辑。 filter 参数也用于逻辑......但选择和覆盖过滤用例是 deleveloper 的决定。

    不可能覆盖所有处理过的数据层和属性上的所有可以想象的过滤器,...对于parent,您只能使用children、id、internal 和parent 属性和子属性(您可以在操场上探索它们)。

    当然,仅仅扩展类型定义以使其与另一个参数一起工作是不够的 - 它是关于处理它的代码。

    如果您需要其他过滤逻辑,您可以为您的文件类型或其他来源编写自己的解析器(或修改分叉的 gatsby 项目)。

    【讨论】:

    猜你喜欢
    • 2019-06-22
    • 2020-10-08
    • 2021-11-25
    • 2015-09-13
    • 2016-11-03
    • 2016-11-18
    • 2021-11-28
    • 1970-01-01
    • 2020-12-07
    相关资源
    最近更新 更多