GraphQL 和 Relay 的概念

Posted

技术标签:

【中文标题】GraphQL 和 Relay 的概念【英文标题】:Concepts of GraphQL and Relay 【发布时间】:2016-07-21 20:14:29 【问题描述】:

我正在尝试在golang 中构建GraphQL endpoints

我一直在关注这些博客Learn Golang + GraphQL + Relay #1 以在golang 中实现graphQl,并且我已经成功构建了GraphQL 的简单端点。

我仍然不清楚一些概念,例如如何使用graphQl 构建pagination 端点, 还有像

这样的方法
//How to build endpoints for fetching data from this query
friends.first(1)
   cursor,
   node 
      name
   


//or this query
friends.last(1)
   cursor,
   node 
      name
   

作为,我来自Angular 背景这个Relay 的概念对我来说仍然很困惑。中继如何促进客户端和服务器之间的通信。

请提供一些使用 Node 或任何使这些概念更清晰的示例

【问题讨论】:

分页不是 GraphQL 规范的一部分,但它是 Connections 的 Relay 库的一部分。您可以通过为 GraphQL 对象定义输入参数来实现不使用 Relay 的分页。顺便说一句,您的示例 GraphQL 查询似乎有点不稳定。它应该是friends(first: 1) cursor, node name ,其中friends 对象接受first GraphQLInt 类型的输入参数。我会找时间为graphql-go创建一个分页示例,看起来它对很多人来说非常有用。 我在这里详细阐述了我的 cmets github.com/graphql-go/graphql/issues/120 【参考方案1】:

分页从来都不是一个简单的问题,也不是 GraphQL 明确解决的问题。 GraphQL 提供了一个数据获取框架,该框架如何用于做事(如分页)取决于开发人员。

Relay 团队已尝试使用 GraphQL 的游标连接 specification 标准化分页。游标连接规范不是 Relay 独有的,可以与 Angular 一起使用,该规范的主要目标是提供一种标准化的方式来处理来自 GraphQL 服务器的大型集合。关于此规范的主要注意事项是每个对象都有一个关联的光标。这个关联的游标允许客户端从集合中的任何点恢复分页。

如果您对实现 Relay 规范感兴趣,我建议您阅读 Sashko Stubailo 的 Understanding pagination: REST, GraphQL, and Relay,他解释了 Relay 连接规范背后的动机并解释了如何实现它。

要查看实际的连接规范,请查看示例SWAPI GraphQL API,它在 GraphQL 中实现了中继规范。我鼓励您打开文档窗口并浏览PeopleConnection。注意它们是如何实现edgespeople 字段的。

如果游标分页对您来说太复杂而无法使用/实现,您始终可以为您的 GraphQL API 公开传统的限制/偏移分页。界面可能看起来像这样:


  friends(limit: 5, offset: 20) 
    name
  

最后,您提供的查询来自 GraphQL 的早期技术预览,实际上并不符合规范 (source)。更合适的查询(如 Hafiz 所述)是:


  friends(first: 1) 
    cursor
    node 
      name
    
  

在 React Europe 2015 上有两场精彩的演讲,我也建议您观看其中更多关于 GraphQL without Relay 的演讲。

Nick Schrock & Dan Schafer - Creating a GraphQL Server Lee Byron - Exploring GraphQL

【讨论】:

以上是关于GraphQL 和 Relay 的概念的主要内容,如果未能解决你的问题,请参考以下文章

无论如何要检查中继是不是注入了graphql服务器?

我们如何从 GraphQL 的 RequestContextHolder 获取 GraphQL 的 HttpServletRequest(DefaultGlobalContext)(使用 graphq

带有 Relay-GraphQL 突变的撤销-重做状态遍历模式

未知插件“Relay” - React、GraphQL 和 Relay

无法使用 graphq-request 表示嵌套对象输入类型的数组

使用 Relay 和 GraphQL 进行查询