GraphQL分页|最初的要求

时间:2019-07-02 15:03:21

标签: 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
  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调用...

1 个答案:

答案 0 :(得分:1)

这是如何限制中继样式分页的一个很好的例子。使用create突变会遇到类似的情况,在这种情况下,将创建的对象手动添加到缓存中最终会搞砸您的分页,因为您没有用于创建的对象的光标。

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