使用 Apollo Server 模拟中继式分页

Posted

技术标签:

【中文标题】使用 Apollo Server 模拟中继式分页【英文标题】:Mock Relay-style pagination with Apollo Server 【发布时间】:2019-12-28 16:39:23 【问题描述】:

我有一个使用 Apollo Server 返回 GraphQL 响应的模拟服务器。其中一个查询是获取teams,它有一个metrics 数组(参见下面的架构):

const mocks = 
  Query: () => (
    teams: (/*parent, args, context, info*/) => teamsFixture,
  ),
;

const graphServer = new ApolloServer( typeDefs: schema, mocks );
graphServer.applyMiddleware( app );

我的查询曾经是(已编辑字段):

teams 
  bpxId
  metrics 
    timestamp
  

真正的 (java) 服务器已对此进行了更改,以允许我仅查询(Relay 样式)指标数组中的第一项,因为它性能不佳:

teams 
  bpxId
  metrics(first: 1) 
    edges 
      node 
        timestamp
      
    
  

这种形状的响应:

metrics: 
  edges: [
    
      node: [Team]
      __typename: "TeamMetricsConnectionEdge"
    
  ]
  __typename: "TeamMetricsConnection"

我想将此功能添加到我的 Apollo Server 模拟中,但不确定如何?

新架构(相关位):

type TeamMetrics 
  timestamp: Int
  # etc


type TeamMetricsConnection 
  edges: [TeamMetricsConnectionEdge]
  pageInfo: PageInfo


type PageInfo 
  hasPreviousPage: Boolean!
  hasNextPage: Boolean!
  startCursor: String
  endCursor: String


type Query 
  teams(bpxId: Int): [Team]


type Team 
  bpxId: Int!
  metrics(first: Int! = 5, after: String): TeamMetricsConnection

如何调整我的模拟响应以处理中继分页?谢谢

【问题讨论】:

【参考方案1】:

您可以使用graphql-relay 创建模拟解析器结果。这可能是为静态模拟数组创建分页的简单方法。使用connectionFromArray 包装一个模拟数组以自动创建适合连接类型的对象结构。可以像在真正的解析器中那样访问模拟中的所有字段参数并将它们传递给函数。

我不确定当您在 MockList 上调用该函数时这是否有效。如果结果的长度一直在变化,那么分页也有点棘手(pageInfo.hasNextPage 可能会混淆,并且您可能会违反 Relay 根据规范所做的许多假设)。因此,如果可以满足您的模拟需求,则可以从一个简单的静态数组开始。

【讨论】:

谢谢,我会在星期一检查一下

以上是关于使用 Apollo Server 模拟中继式分页的主要内容,如果未能解决你的问题,请参考以下文章

HTML 书本式分页

AI-响应式分页器

操作系统——存储管理:分区分页分段请求式分页和虚拟内存

使用 Apollo-Server-Express 从服务器中使用光标分页查询 REST API

在 apollo 和 Relay 分页中返回一个 totalCount 字段

NextJS 中的 Apollo 分页