【问题标题】:Mock Relay-style pagination with Apollo Server使用 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
}

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

【问题讨论】:

    标签: javascript graphql apollo apollo-server


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢,我会在星期一检查一下
    猜你喜欢
    • 2018-07-23
    • 2019-04-17
    • 2021-11-09
    • 2022-07-11
    • 1970-01-01
    • 2021-01-09
    • 2020-10-30
    • 2021-11-28
    • 2018-12-24
    相关资源
    最近更新 更多