使用 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 模拟中继式分页的主要内容,如果未能解决你的问题,请参考以下文章
使用 Apollo-Server-Express 从服务器中使用光标分页查询 REST API