如何从Apollo服务器端点获得完整的GraphQL模式?

如何从Apollo服务器端点获得完整的GraphQL模式?,graphql,apollo-server,keystonejs,graphql-schema,Graphql,Apollo Server,Keystonejs,Graphql Schema,我正在使用Apollo服务器编写GraphQL和REST服务之间的GraphQL接口。此接口将为Apollo客户端前端提供单个GraphQL端点 目前唯一的服务是KeystoneJS应用程序,它通过(据我所知)Apollo服务器提供GraphQL端点。为了暂时保持简单,我正在从Keystone JS服务器GraphQL游乐场下载GraphQL模式,并将其用作接口的GraphQL模式(在删除Keystone生成的、Apollo服务器不理解的定义之后) 我想自动化这个过程——也就是说,以某种方式“获

我正在使用Apollo服务器编写GraphQL和REST服务之间的GraphQL接口。此接口将为Apollo客户端前端提供单个GraphQL端点

目前唯一的服务是KeystoneJS应用程序,它通过(据我所知)Apollo服务器提供GraphQL端点。为了暂时保持简单,我正在从Keystone JS服务器GraphQL游乐场下载GraphQL模式,并将其用作接口的GraphQL模式(在删除Keystone生成的、Apollo服务器不理解的定义之后)


我想自动化这个过程——也就是说,以某种方式“获取”KeystoneJS/Apollo服务器生成的GraphQL模式,就像从GraphQL平台下载一样。是否有一种从端点执行此操作的方法?(我不想触及KeystoneJS内部,只要通过端点访问模式即可)

您可以对任何GraphQL服务运行内省查询(假设它们没有禁用内省——有些服务在生产中会这样做)。此查询的结果可以传递到
buildClientSchema
,以根据内省结果重建模式(当然,没有任何字段解析逻辑)。然后,可以通过调用
printSchema
将返回的GraphQLSchema对象转换为SDL

下面是一个使用axios的示例,但您可以使用任何希望发出请求的http库:

const { buildClientSchema, getIntrospectionQuery, printSchema } = require('graphql')
const res = await axios.post(ENDPOINT_URL, { query: getIntrospectionQuery() })
const schema = buildClientSchema(res.data.data)
const sdl = printSchema(schema)
console.log(sdl)

注意:第一个“数据”是axios API从服务器调用的实际JSON响应,而第二个“数据”是实际的“数据”属性,如果您当前正在使用GraphQL运行自省查询,我们希望传递给
buildClientSchema

,有什么理由不能使用您选择的HTTP库,使用相同的查询向KeystoneJS端点发出请求吗?@DanielRearden——我已经考虑过了。我是GraphQL新手,所以以前从未使用过内省。正如我从中看到的,可以得到JSON,它为您提供了关于模式特定方面的信息。我想我可以用它来重建完整模式的SDL,但我正在使用一个大型模式——目前有820行,而且还会增加——有很多嵌套类型。有没有一种方法可以简单地通过内省请求整个模式,并快速/轻松地将其转换为SDL?使用自省足够容易吗?我的错——我忘了游乐场有一个模式的“下载”按钮,所以当你说你是通过游乐场下载模式时,我误解了你。我假设您已经在使用内省来执行此操作。FWIW,我想您不必使用axios来执行请求,如果您有权访问Keystone实例,也可以使用。这将在单独的应用程序中进行,因此除非我通过Keystone API公开它,否则我不会。。。。