在vanilla GraphQL中实现分页

Net*_*bby 7 mongoose mongodb ecmascript-5 graphql graphql-js

到目前为止,我发现的每个教程都通过Apollo,Relay或其他一些魔术框架在GraphQL中实现了分页.我希望在这里找到类似问题的答案,但它们不存在.我理解如何设置查询,但我不知道如何实现解析器.

有人能指出我正确的方向吗?我正在使用mongoose/MongoDB和ES5,如果这有帮助的话.

编辑:值得注意的是,如果您选择使用,学习GraphQL的官方网站没有分页条目graphql.js.

编辑2:我喜欢有些人在做研究之前投票结束问题,而其他人则利用他们的知识帮助他人.无论你怎么努力,你都无法阻止进步.(:

Ble*_*ess 6

在vanilla GraphQL中的分页

// Pagination argument type to represent offset and limit arguments
const PaginationArgType = new GraphQLInputObjectType({
  name: 'PaginationArg',
  fields: {
    offset: {
      type: GraphQLInt,
      description: "Skip n rows."
    },
    first: {
      type: GraphQLInt,
      description: "First n rows after the offset."
    },
  }
})

// Function to generate paginated list type for a GraphQLObjectType (for representing paginated response)
// Accepts a GraphQLObjectType as an argument and gives a paginated list type to represent paginated response.
const PaginatedListType = (ItemType) => new GraphQLObjectType({
  name: 'Paginated' + ItemType, // So that a new type name is generated for each item type, when we want paginated types for different types (eg. for Person, Book, etc.). Otherwise, GraphQL would complain saying that duplicate type is created when there are multiple paginated types.
  fields: {
    count: { type: GraphQLInt },
    items: { type: new GraphQLList(ItemType) }
  }
})

// Type for representing a single item. eg. Person
const PersonType = new GraphQLObjectType({
  name: 'Person',
  fields: {
    id: { type: new GraphQLNonNull(GraphQLID) },
    name: { type: GraphQLString },
  }
})

// Query type which accepts pagination arguments with resolve function
const PersonQueryTypes = {
  people: {
    type: PaginatedListType(PersonType),
    args: { 
      pagination: { 
        type: PaginationArgType, 
        defaultValue: { offset: 0, first: 10 } 
      },
    },
    resolve: (_, args) => {
      const { offset, first } = args.pagination
      // Call MongoDB/Mongoose functions to fetch data and count from database here.
      return {
        items: People.find().skip(offset).limit(first).exec()
        count: People.count()
      }
    },
  }
}

// Root query type
const QueryType = new GraphQLObjectType({
  name: 'QueryType',
  fields: {
    ...PersonQueryTypes,
  },
});

// GraphQL Schema
const Schema = new GraphQLSchema({
  query: QueryType
});
Run Code Online (Sandbox Code Playgroud)

并在查询时:

{
  people(pagination: {offset: 0, first: 10}) {
    items {
      id
      name
    }
    count
  }
}
Run Code Online (Sandbox Code Playgroud)

这里创建了一个启动板.