首页 > 解决方案 > Graphql 拉取数据进行分页

问题描述

我有以下架构

User {
    username: String!
    name: String!
    posts(page: Int!): [Post]
}

Post {
    title: String!
    description: String
}

并在查询

type Query {
    user(username: String!): User
}

在我定义的解析器中Query -> useruser -> posts 当我提取我使用的数据时:

{
    user(username: 'pewpewlasers'){
        username
        name
        posts(page: 1){
            title
            description
        }
    }
}

它工作得很好。现在我的问题是如何在无限滚动的情况下有效地拉第二页(最后加载更多按钮)。我可以使用:

{
    user(username: 'pewpewlasers'){
        username
        name
        posts(page: 2){
            title
            description
        }
    }
}

但是再次吸引用户似乎没有必要,我只需要发布更多内容。是否有内置方式 graphql 处理这个?还是我必须定义一个单独的posts(page: Int!, username: String!)查询

标签: graphqlapolloapollo-servergraphql-tools

解决方案


有几种方法可以解决这个问题:

  1. 创建一个中间类型,例如UserRelations专门用于为这些类型的查询提供入口点,而无需通过用户。这是最简单的方法,我以前也做过,但是用这种方式来搞乱数据建模感觉很讨厌。
  2. 做到这一点,以便每当您解析 a 时User,您都会检查正在请求哪些字段。如果您只要求不需要加载用户的字段(即仅关系),请返回一个虚拟对象而不是获取数据。这涉及更多,因为这意味着查看解析器中的字段 AST,但熟悉这一点是使用 GraphQL 进行大多数性能优化的关键。

推荐阅读