GraphQL 和中继的概念

Concepts of GraphQL and Relay

我正在尝试在 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 明确解决的问题。 GraphQL 提供了一个数据获取框架,如何使用该框架来做事情(如分页)取决于开发人员。

GraphQL 的 Relay team has attempted to standardize pagination with the cursor connection specification。游标连接规范不是 Relay 独有的,可以与 Angular 一起使用,该规范的主要目标是提供一种标准化的方式来处理来自 GraphQL 服务器的大型集合。关于此规范需要注意的主要事情是每个对象都有一个关联的游标。这个关联的游标允许客户端从集合中的任何点恢复分页。

如果您有兴趣实施 Relay 规范,我鼓励您阅读 Sashko Stubailo 的 Understanding pagination: REST, GraphQL, and Relay,他在其中解释了 Relay 连接规范背后的动机并解释了如何实施它。

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

如果游标分页对您来说太复杂 use/implement,您总是可以为您的 GraphQL API 公开传统的 limit/offset 分页。界面可能看起来像这样:

{
  friends(limit: 5, offset: 20) {
    name
  }
}

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

{
  friends(first: 1) {
    cursor
    node {
      name
    }
  }
}

我还建议您观看 React Europe 2015 的两个精彩演讲,其中更多地讨论了没有中继的 GraphQL。