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
的值,然后在前端我可以计算一个游标并将其传递给后端上面的查询。
但就我个人而言,我发现了一些缺点:
- 我正在向前端公开我的光标计算方式,这很糟糕,因为如果我需要更改该过程,我需要在前端和后端更改它...
- 我不想为单个用户创建另一个查询字段只是因为我需要它的 id 传递给
users
查询字段。
- 我也不想为此调用 2 API...
这是 Relay-style 分页限制的一个很好的例子。你会遇到类似的场景,创建突变,手动将创建的对象添加到缓存中最终会搞砸你的分页,因为你不会有创建的对象的游标。
只要您实际上没有使用 Relay client-side,一种解决方案就是完全放弃使用游标。您可以保留 before
和 after
字段,但只需接受 id
(或 _id
或任何 PK)值而不是游标。这就是我最近在一个项目中所做的,它大大简化了事情。
根据使用 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
的值,然后在前端我可以计算一个游标并将其传递给后端上面的查询。
但就我个人而言,我发现了一些缺点:
- 我正在向前端公开我的光标计算方式,这很糟糕,因为如果我需要更改该过程,我需要在前端和后端更改它...
- 我不想为单个用户创建另一个查询字段只是因为我需要它的 id 传递给
users
查询字段。 - 我也不想为此调用 2 API...
这是 Relay-style 分页限制的一个很好的例子。你会遇到类似的场景,创建突变,手动将创建的对象添加到缓存中最终会搞砸你的分页,因为你不会有创建的对象的游标。
只要您实际上没有使用 Relay client-side,一种解决方案就是完全放弃使用游标。您可以保留 before
和 after
字段,但只需接受 id
(或 _id
或任何 PK)值而不是游标。这就是我最近在一个项目中所做的,它大大简化了事情。