繁体   English   中英

GraphQL 中基于 Cursor 的分页命名约定

[英]Cursor Based Pagination Naming Convention in GraphQL

在GraphQL API中,我经常看到NQ、MQ等命名约定作为cursor中使用的参数。 这是一个示例,如下所示,

 "data": {
    "items": {
      "totalCount": 351,
      "pageInfo": {
        "hasNextPage": true,
        "hasPreviousPage": false,
        "endCursor": "Mw",
        "startCursor": "MQ"
      },
      "edges": [
        {
          "cursor": "MQ",
          "node": {
            "id": "UGxhY2UtMzUy",
            "displayName": "Redbeard"
          }
        },
        {
          "cursor": "Mg",
          "node": {
            "id": "UGxhY2UtMzUx",
            "displayName": "Frey of Riverrun"
          }
        },
        {
          "cursor": "Mw",
          "node": {
            "id": "QmlsbGVyLTI=",
            "displayName": "Something Else"
          }
        }
      ]
    }
  }
}

资料来源: https://dev.to/tymate/first-dive-into-graphql-ruby-nak

其他示例包括此导轨示例: https://www.2n.pl/blog/graphql-pagination-in-rails

这些命名约定是什么?例如,您将如何分页?

中继服务器规范定义了应如何进行分页以与中继 GraphQL 客户端兼容。 虽然它不是完成分页的唯一方法,但它已经发展成为一种标准——至少在示例中,因为它可以很容易地引用。

关于连接的部分提供了有关游标如何工作的更多信息:

每条边都有一个 cursor 值。 这个值 - 他们称之为 - 一个不透明的值,这意味着它不应该被服务器解释。 它是一个只有服务器才能解释的引用/指针。 因此,如果您有一个获取一堆值的查询:

edges: [
  { cursor: "abc", node: {...} },
  { cursor: "def", node: {...} },
  { cursor: "ghi", node: {...} },
  { cursor: "jkl", node: {...} },
  { cursor: "mno", node: {...} }
]

您可以通过查看最后一个元素 mno 的mno来请求下一页并将其传递到查询中。

query {
  manyQuery(first: 5, after: "mno") {
    edges {
      cursor
      node {...}
    }
  }
}

这将为您提供接下来的 5 个节点。 另请参阅graphql.org 上的此部分

因此,回答您的问题:该字符串可能包含服务器可以用来引用您的节点之一的任何内容。 例如数据库中的 id。 为了消除从 API 用户传递任意值的诱惑,此字符串通常被编码为 base64 格式。 该值应该对客户端没有意义,并且仅用于传递回服务器。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM