GraphQL分页|第一个请求
根据使用graphQL进行分页的基于连接的模型,我有以下简化模式GraphQL分页|第一个请求,graphql,apollo,graphql-js,apollo-server,relay,Graphql,Apollo,Graphql Js,Apollo Server,Relay,根据使用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 hasNext
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
}
}
}
}
我已经尝试过的(一种可能的解决方案)是,我知道在后端,光标是数据库中记录的\u id
的编码值。因此,在/users/52
上,我可以为特定的用户发出一个单独的请求,获取id
的值,然后在前端我可以计算一个光标,并在上面的查询中将其传递到后端
但就我个人而言,我发现了几个缺点:
users
query字段这是一个很好的例子,说明了中继式分页是如何限制的。您将遇到类似的创建突变场景,在该场景中,手动将创建的对象添加到缓存中最终会破坏分页,因为创建的对象没有光标
只要您没有实际使用中继客户端,一个解决方案就是完全放弃使用游标。您可以将
字段保留在之前和之后,但只需接受id
(或\u id
或任何主键)值而不是光标。这就是我在最近的一个项目中所做的,它大大简化了事情。您实际上是在使用中继客户端,还是只是在模式中使用中继约定并使用不同的客户端(例如,Apollo)?我使用Apollo服务器包作为API服务器,并在前端使用Apollo客户端和ReactJS。更重要的是,对我来说,要很好地掌握如何优雅地解决前面提到的用例,这就是为什么我尽量不提及除了graphQL之外的任何特定技术。谢谢!我也在考虑这一点,当我选择中继连接样式分页时,id带来了一些复杂性,这对于某些情况(比如我的情况)可能是不必要的。。。