首页 > 解决方案 > 如何在graphql中实现分页,它返回分页元数据和数据集

问题描述

目前我使用graphql默认分页,即使用限制偏移(下面给出的代码)。这工作正常。但是我们如何包含分页元数据而不是团队列表。并连同此一起返回分页元数据。我使用 sequalize 来获取数据

            type Query {
            allTeams(page:Int, pageSize:Int): [Team]
        }
        type Team {
            id: Int
            name: String  
        }

        //resolver with pagination   

        const paginate = ( page, pageSize ) => { 
          var offset = page * pageSize;
          var limit =  pageSize;  
          return {
            offset,
            limit,
          };
        };

        export const resolvers = {
            Query: {     
                  allTeams: async (obj, args, context, info ) =>  Teams.findAll(           
                  paginate( args.page, args.pageSize ),         
                ),
            },
        }

上面的代码只会返回团队列表。有什么办法可以返回包含团队列表和分页详细信息的输出

         {
          "data": {
            "allTeams": [
              {
                "id": 4,
                "name": "Team created from postman",

              },
              {
                "id": 5,
                "name": "Team created from postman",

              }
              ]
            },
               "pageInfo": {
                "currentPage": 2,
                "perPage": 2,
                "itemCount": 4,
                "pageCount": 2,
                "hasPreviousPage": true,
                "hasNextPage": false
              }
        }

标签: node.jspaginationgraphqlsequelize.jsapollo

解决方案


是的,您只需将分页元数据添加到您的架构并在解析器中提供数据。因此,对于您要实现的输出,架构如下所示:

type Query {
  teams(page:Int, pageSize:Int): TeamsConnection
}

type TeamsConnection {
  results: [Team]
  pageInfo: PageInfo
}

type Team {
  id: Int
  name: String  
}

type PageInfo {
  currentPage: Int
  perPage: Int
  itemCount: Int
  pageCount: Int
  hasPreviousPage: Boolean
  hasNextPage: Boolean
}

然后,您的解析器将需要返回响应数据的新形状。所以像:

export const resolvers = {
  Query: {     
    allTeams: async (obj, args, context, info ) => {
      const results = awaitTeams.findAll(           
        paginate(args.page, args.pageSize),         
      );
      return {
        results,
        pageInfo: {...}
      }
    }
  }
}

推荐阅读