如何在 returns 分页元数据和数据集的 graphql 中实现分页

How to implement pagination in graphql which returns pagination metadata along with dataset

目前我使用 graphql 默认分页,即使用限制偏移(下面给出的代码)。这工作正常。但是我们如何包含分页元数据而不是团队列表。和 return 分页元数据。我使用 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 ),         
                ),
            },
        }

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

         {
          "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
              }
        }

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

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
}

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

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