首页 文章

如何在Relay中管理游标和排序?

提问于
浏览
6

我们有一个graphql服务器(不是用javascript编写)服务于分页的对象列表 . 我们试图遵循继电器规范,但我们遇到了一个可以使用澄清的有趣案例 .

具体来说:是否允许游标依赖连接的其他输入?与https://github.com/graphql/graphql-relay-js/issues/20类似,我们的连接采用sort_key参数来确定返回列表的排序顺序 . 根据指定的排序顺序,对象的边可能返回不同的游标值(因为服务器在每种情况下都需要不同的信息来确定下一个对象) . 但是,仔细阅读https://facebook.github.io/relay/docs/guides-mutations.html#range-add表明这是不允许的;返回新创建的边的突变必须返回一个光标,该光标可以普遍应用于可能出现该边的所有可能列表? facebook如何解决这个问题?

2 回答

  • 2

    我有同样的问题 . 所以,我决定写一个 npm 包来处理这个问题 .

    您可以使用fast-relay-pagination npm包进行排序,向后和向前 pagination 并过滤 Mongoose model或 MongoDB 对象 .

    此程序包通过使用 MongooseMongoDB find和limit来改进 graphql-relay lazy loading . 正如您所知, graphql-relay's connectionFromArray 获取所有数据并对数据执行切片,这对于大量数据来说效率不高 .


    您可以在下面看到一个示例:

    ...
    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
        })
      }),
    }
    
  • 3

    是的,光标应该包含足够的信息以便从该点开始提取下一页(包括排序和过滤等约束),但是否/如何执行此操作取决于您,因为它是特定于实现的 .

    至于突变,在 getConfigs() 实现中,您可以基于每个呼叫指定 rangeBehaviors . 因此,如果您有一个排序视图,您可以根据排序顺序选择追加或前置 . 此行为指定Relay将在客户端执行哪些操作以更新其存储 . 您仍然有责任确保GraphQL服务器的代码获得所需的所有信息(通过输入变量)以正确执行实际的突变 .

相关问题