将 graphQL 片段添加到模式中,并且可用于所有查询

Posted

技术标签:

【中文标题】将 graphQL 片段添加到模式中,并且可用于所有查询【英文标题】:Add graphQL fragment to schema, and have available for all queries 【发布时间】:2018-03-23 22:15:12 【问题描述】:

以下在graphiQL中正确执行

fragment BookGridFields on Book 
  _id
  title



  allBooks 
    ...BookGridFields
  


我的问题是,可以在我的架构中指定片段,就在我的书类型定义的下方,就像这样

type Book 
  _id: String
  title: String
  pages: Int
  weight: Float
  authors: [Author]


fragment BookGridFields on Book 
  _id
  title

这样我就可以像这样运行查询


  allBooks 
    ...BookGridFields
  

无需将片段定义为我的查询的一部分。

目前上述错误与

未知片段“BookGridFields”

【问题讨论】:

我不认为您在服务器上定义片段。您在执行查询时在客户端上定义它们:graphql.org/learn/queries/#fragments 和 dev.apollodata.com/react/fragments.html 谢谢 - 是的,我已经看到了这两个 - 似乎是不可能的,但我想我会在这里检查专家:) 您没有用 apollo 标记问题,但我发布的链接允许可重复使用的片段。我想这取决于您使用的客户端库。 目前绝对不可能作为 vanilla GraphQL 的一部分。您希望从服务器共享片段中获得什么好处? @stubailo 我对 GraphQL 还是很陌生 - 直观地说,在我的模式中定义它似乎更有意义,并考虑到应用程序用例,所以我不会必须在应用程序代码中维护和传递片段。但是你的推文很有意义。如果您想将其添加为答案,我很乐意投票并接受,以使任何可能发现此问题的人受益。 【参考方案1】:

根据 graphql 文档,我看到片段是查询 api 的一部分,而不是用于设置模式的有效语法。这使我得出结论,目前无法在架构中指定片段。

https://graphql.org/learn/queries/#fragments

【讨论】:

这使得定义接口非常非常愚蠢。 @BenjaminR OT,也许,但你能详细说明你的意思吗? @jberryman 我认为 BenjaminR 意味着接口实现中存在不必要的冗余(必须在接口和实现类型中指定字段,这首先会降低使用接口的价值。)我使用 Dgraph 并注意到它们允许在其实现类型中不重复接口字段的模式,这真的很棒。

以上是关于将 graphQL 片段添加到模式中,并且可用于所有查询的主要内容,如果未能解决你的问题,请参考以下文章

你可以在graphql服务器模式文件中使用片段吗

无法通过 Prisma 在 GraphQL-yoga 中使用片段

动态生成 GraphQL 模式支持

在 GraphQL 中重用输入类型作为片段 [重复]

nestjs 是不是支持 graphql 片段?

在 Java 的 GraphQL 查询中添加片段