GraphQL 中基于游标的分页命名约定

Cursor Based Pagination Naming Convention in GraphQL

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

 "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

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

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

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

section on connections 提供了有关游标如何工作的更多信息:

每条边都有一个游标值。这个值是 - 他们所说的 - 一个不透明的值,意味着它不应该被服务器解释。它是一个 reference/a 指针,只有服务器可以解释。所以,如果你有一个获取一堆值的查询:

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

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

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

这将为您提供接下来的 5 个节点。另见 this section on graphql.org

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