基于内部片段的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!
...所以可能的参数只有filter
、limit
、skip
和sort
。参数 filter
也定义了形状 - 它必须是 MarkdownRemarkFilterInput
类型。您只能将在此类型中定义的属性用于 filter
参数。
这是设计使然,这就是设计师创建解析器的方式以及他对如何处理以及处理哪些参数的意图。
这就像分页 - 您不必使用任何结果字段作为参数,因为 skip
和 limit
用于记录级别。这样,这些参数根本与字段无关。它们用于解析器中的某些逻辑。 filter
参数也用于逻辑......但选择和覆盖过滤用例是 deleveloper 的决定。
不可能覆盖所有处理过的数据层和属性上的所有可以想象的过滤器,...对于parent
,您只能使用children
、id
、internal
和parent
属性和子属性(您可以在操场上探索它们)。
当然,仅仅扩展类型定义以使其与另一个参数一起工作是不够的 - 它是关于处理它的代码。
如果您需要其他过滤逻辑,您可以为您的文件类型或其他来源编写自己的解析器(或修改分叉的 gatsby 项目)。
【讨论】:
完全正确,我看到 GatsbyJS 有关于如何创建解析器的文档gatsbyjs.org/docs/schema-customization以上是关于基于内部片段的graphql过滤器(gatsbyJS)的主要内容,如果未能解决你的问题,请参考以下文章
使用 GatsbyJS 的 GraphQL 查询中的范围文件夹结构
GatsbyJs - 如何处理来自 Contentful 插件的空 graphql 节点