基于内部片段的graphql过滤器(gatsbyJS)

Posted

技术标签:

【中文标题】基于内部片段的graphql过滤器(gatsbyJS)【英文标题】:graphql filter based on internal fragments (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 定义的

【问题讨论】:

【参考方案1】:

这是解析器作者的责任。

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

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

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

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

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

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

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

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

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

【讨论】:

完全正确,我看到 GatsbyJS 有关于如何创建解析器的文档gatsbyjs.org/docs/schema-customization

以上是关于基于内部片段的graphql过滤器(gatsbyJS)的主要内容,如果未能解决你的问题,请参考以下文章

使用 GatsbyJS 的 GraphQL 查询中的范围文件夹结构

如何在 graphQL 片段中定义可选字段以进行查询

GatsbyJs - 如何处理来自 Contentful 插件的空 graphql 节点

Gatsbyjs 中的 GraphQL - 仅返回包含特定字段的数据

在 GatsbyJS/GraphQL 中组合页面查询

GatsbyJS - 如何在 GraphQL 中查询长文本内容字段