顶级边缘和顶级节点之间有什么区别?

时间:2020-02-12 19:21:33

标签: graphql

我是GraphQL的新手,正在使用WPGraphQL和WooGraphQL。

他们的顶级连接使我可以像这样扩展nodesedges

{
  wpgraphql {
    productCategories {
      # What's the difference between these?

      # 1) top-level nodes
      nodes {
        id
        name
      }

      # 2) top-level edges
      edges {
        node {
          id
          name
        }
      }
    }
  }
}

这样返回的响应(省略ID):

{
  "data": {
    "wpgraphql": {
      "productCategories": {
        "nodes": [
          {
            "name": "Accessories"
          },
          {
            "name": "Gift Cards"
          },
          {
            "name": "Indoor"
          }
        ],
        "edges": [
          {
            "node": {
              "name": "Accessories"
            }
          },
          {
            "node": {
              "name": "Gift Cards"
            }
          },
          {
            "node": {
              "name": "Indoor"
            }
          }
        ]
      }
    }
  }
}

我的问题很简单:我使用哪个?为什么两者都有?

这是GraphiQL Explorer的屏幕截图,如果有帮助的话。

explorer preview

1 个答案:

答案 0 :(得分:1)

实现Relay specification的GraphQL模式利用Connection类型来建模一对多或多对多关系。

每个连接都包括一个边列表和一个PageInfo对象。每个边缘包括一个node和该节点的cursor

边可能还包含其他字段-例如,如果我们在用户节点之间建立了朋友连接,则可能会包括创建友谊时的时间戳。但是,通常,边缘仅用于它们公开的cursor字段。 cursor值在通过连接进行分页并在每个边缘暴露时使用,表示您可以从结果中的任意点开始分页。游标不包含在节点中,因为它可能是特定于连接的,而不仅仅是节点本身(例如,某些游标编码排序标准)。

但是,如果作为客户端,您不需要分页连接结果,而只想获取所有节点,则您可能无需关心游标。在这些情况下,具有边不会增加任何值,只会增加查询的深度。因此,为方便客户,一些GraphQL服务选择了在边缘之外公开 just 个用于连接的节点。