在GraphQL中,“ edges”和“ node”是什么意思?


100

我正在使用一个特定的GraphQL端点,尽管我提供了一个干净的JSON结构作为查询,但是当我得到结果时,我得到了“ edges”和“ node”标签。似乎正在污染我的数据,没有明显的好处。为什么要在那里,有没有可能摆脱这些而更快,更简单地解析数据?


1
连接,边和节点是主要在GraphQL客户端Relay的上下文中使用的术语。可以在此FAQ中找到更多信息。
marktani

2
只是澄清一下:连接不是特定于Relay的东西。要深入了解,请参见本文:medium.com/p/explaining-graphql-connections-c48b7c3d6976
helfer

它是为长结果列表提供分页的某种标准方式。不依赖于任何实现。
马特

Answers:


64

让我们以简单的单词开始简短介绍


GraphQl继电器规格

  • 重新获取对象的机制
  • 如何通过连接进行分页的描述
  • 突变周围的结构,使其可预测

连接方式:

  • 一个连接对象的元数据,如集合edgespageInfo...
  • pageInfo将包含hasNextPagehasPreviousPagestartCursorendCursor

    • hasNextPage 会告诉我们是否有更多可用的边,或者我们是否已达到此连接的末端。
  • 记录的数组:边

    • 边缘将为您提供使用数据(节点)的灵活性
    • 边缘将帮助您进行分页,有graphql GraphQLList但没有分页等功能,仅具有对象数组(数据)
  • 每个边都有

    • a node:记录或数据
    • 一个cursor:base64编码的字符串,以帮助分页

https://facebook.github.io/relay/graphql/connections.htm

节点:

  • 您可以设置需要使用中继显示的节点数 connectionArgs(first, last, after, before)

中继分页的工作原理

  • 提取集合中的所有对象,并根据first/lastx记录返回一个切片,并通过connectionArgs使用

  • after/before 用于使用来自节点的光标向GraphQL服务器指示所需切片(数据)的数量

还有更多的事情要考虑像nodeDefinitionsglobalFieldIdnodeInterfaces

https://github.com/graphql/graphql-relay-js#object-identification


17
我认为这个答案的要旨是正确的,但它包含许多误解。本文很好地解释了GraphQL连接背后的原因:medium.com/p/explaining-graphql-connections-c48b7c3d6976
helfer

6
您在哪里找到误解,只是简要的信息,如果您发现任何误解,可以随时加以改进以使其变得更好
p0k8_

我可以通过graphql UI 使用这些构造吗?例如hasNextPage,还是仅通过带有Relay的JS可用?
Ska

是的,您可以使用graphql-relay从graphiql UI中进行处理
p0k8_

不是each node will have a cursor,而是each edge will have a cursor参考blog.apollographql.com/…–
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.