使用Apollo Server进行模拟中继样式分页

时间:2019-08-23 10:53:40

标签: javascript graphql apollo apollo-server

我有一个使用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)服务器已对此进行了更改,以允许我仅查询(中继样式)指标数组中的第一项,因为它没有性能:

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 个答案:

答案 0 :(得分:0)

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

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