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

根据使用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
        }
      }
    }
  }
我已经尝试过的(一种可能的解决方案)是,我知道在后端,光标是数据库中记录的
\u id
的编码值。因此,在
/users/52
上,我可以为特定的用户发出一个单独的请求,获取
id
的值,然后在前端我可以计算一个光标,并在上面的查询中将其传递到后端

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

  • 我将展示如何将光标计算到前端,这很糟糕,因为如果我需要更改该过程,我需要在前端和后端更改它
  • 我不想为单个用户创建另一个查询字段,因为我需要将其id传递给
    users
    query字段
  • 我也不想为此做2个API调用

  • 这是一个很好的例子,说明了中继式分页是如何限制的。您将遇到类似的创建突变场景,在该场景中,手动将创建的对象添加到缓存中最终会破坏分页,因为创建的对象没有光标


    只要您没有实际使用中继客户端,一个解决方案就是完全放弃使用游标。您可以将
    字段保留在
    之前和
    之后,但只需接受
    id
    (或
    \u id
    或任何主键)值而不是光标。这就是我在最近的一个项目中所做的,它大大简化了事情。

    您实际上是在使用中继客户端,还是只是在模式中使用中继约定并使用不同的客户端(例如,Apollo)?我使用Apollo服务器包作为API服务器,并在前端使用Apollo客户端和ReactJS。更重要的是,对我来说,要很好地掌握如何优雅地解决前面提到的用例,这就是为什么我尽量不提及除了graphQL之外的任何特定技术。谢谢!我也在考虑这一点,当我选择中继连接样式分页时,id带来了一些复杂性,这对于某些情况(比如我的情况)可能是不必要的。。。