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

时间:2020-04-15 11:38:06

标签: graphql gatsby

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

)访问的任何属性

codebox来自gatsby-docs

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

错误:未按NodeFilterInput类型定义字段

1 个答案:

答案 0 :(得分:1)

这是解决者的责任。

您可以将其与常规函数参数和返回结果进行比较。在graphQL中,两者都是严格定义/键入的。

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

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

...因此可能的参数只有filterlimitskipsort。参数filter也定义了形状-必须为MarkdownRemarkFilterInput类型。您只能将为此类型定义的属性用于filter参数。

这是设计使然,这是设计人员创建解析器的方式以及他关于如何以及如何处理参数的意图。

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

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

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

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