GraphQL 分页 |第一个请求

GraphQL Pagination | The very first request

根据使用 graphQL 的基于连接的分页模型,我有以下简化模式。

type User {
  id: ID!
  name: String!
}

type UserConnection {
  totalCount: Int
  pageInfo: PageInfo
  edges: [UserEdge]
}

type UserEdge {
  cursor: String
  node: User
}

type PageInfo {
  lastCursor: Int
  hasNextPage: Boolean
}

type Query {
  users(first: Int, after: String): UserConnection
}

考虑 SPA 前端中的以下路由器:

/users - 一旦用户点击此页面,我就会从列表顶部获取前 10 条记录,而且我能够通过重用我检索到的游标来分页来自第一个回复。

/user/52 - 在这里我想显示 10 条应该从 user52 位置开始的记录。

问题 在第一次请求时检索特定记录子集的可能方法有哪些?此时此刻我没有任何游标来构建类似于

的东西
  query GetTenUsersAfter52 {
    users(first: 10, after: "????") { # struggling to pass anything as a cursor...
      edges {
        node {
          name
        }
      }
    }
  }

我已经尝试过的(一个可能的解决方案) 是我知道在后端游标是 _id 的编码值记录在数据库中。因此,在 /users/52 上,我可以为该特定用户发出单独的请求,获取 id 的值,然后在前端我可以计算一个游标并将其传递给后端上面的查询。

但就我个人而言,我发现了一些缺点:

  1. 我正在向前端公开我的光标计算方式,这很糟糕,因为如果我需要更改该过程,我需要在前端和后端更改它...
  2. 我不想为单个用户创建另一个查询字段只是因为我需要它的 id 传递给 users 查询字段。
  3. 我也不想为此调用 2 API...

这是 Relay-style 分页限制的一个很好的例子。你会遇到类似的场景,创建突变,手动将创建的对象添加到缓存中最终会搞砸你的分页,因为你不会有创建的对象的游标。

只要您实际上没有使用 Relay client-side,一种解决方案就是完全放弃使用游标。您可以保留 beforeafter 字段,但只需接受 id(或 _id 或任何 PK)值而不是游标。这就是我最近在一个项目中所做的,它大大简化了事情。