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
。注意它们是如何实现edges
和people
字段的。
如果游标分页对您来说太复杂而无法使用/实现,您始终可以为您的 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 的 RequestContextHolder 获取 GraphQL 的 HttpServletRequest(DefaultGlobalContext)(使用 graphq
带有 Relay-GraphQL 突变的撤销-重做状态遍历模式
未知插件“Relay” - React、GraphQL 和 Relay