How to manage cursors and sorting in Relay?

后端 未结 2 802
温柔的废话
温柔的废话 2021-02-09 07:18

We have a graphql server (not written in javascript) serving a paginated list of objects. We\'re trying to conform to the relay specification, but we\'ve hit an interesting case

2条回答
  •  长发绾君心
    2021-02-09 08:12

    I had the same problem. So, I decided to write a npm package to handle this issue.

    You can use fast-relay-pagination npm package for sorting, backward and forward pagination and filter Mongoose model or MongoDB object.

    This package improves graphql-relay lazy loading by using Mongoose or MongoDB find and limit. As you definitely know, graphql-relay's connectionFromArray fetchs all data and performs slicing on data, which is not efficient for large amount.


    You can see an example in below:

    ...
    import {
      fetchConnectionFromArray
    } from 'fast-relay-pagination'
    ...
    export default{
      type: orderConnection.connectionType,
      args: {
        ...connectionArgs,
        orderFieldName: {
          type: GraphQLString,
        },
        sortType: {
          type: GraphQLInt,
        },
      },
      resolve: needAdmin(async (_, args) => {
        let orderFieldName = args.orderFieldName || '_id'
        let sortType = args.sortType || -1
        let after = args.after
        let before = args.before
        let filter = args.filter
        let first = args.first
        let last = args.last
        return fetchConnectionFromArray({
          dataPromiseFunc: SampleModel.find.bind(SampleModel), // required
          filter, // optional (for using filter on model collection) - for example => {username: 'test'} 
          after, //optiona
          before, // optional
          first, //optional
          last, // optional
          orderFieldName, // optional
          sortType, // optional
        })
      }),
    }
    

提交回复
热议问题