Как можно получить полную схему GraphQL из конечной точки Apollo Server?

Я пишу интерфейс GraphQL между сервисами GraphQL и REST с использованием Apollo Server. Этот интерфейс предоставит единую конечную точку GraphQL для клиентского интерфейса Apollo.

Единственная служба на данный момент - это приложение KeystoneJS, которое предоставляет конечную точку GraphQL через (насколько мне известно) сервер Apollo. Чтобы упростить задачу, я загружаю схему GraphQL с GraphQL Playground сервера KeystoneJS и использую ее в качестве схемы GraphQL моего интерфейса (после удаления определений, которые генерирует Keystone, а сервер Apollo не понимает).

Я хотел бы автоматизировать этот процесс - то есть каким-то образом "захватить" схему GraphQL, которую генерирует KeystoneJS/Apollo Server, как если бы я загружал ее с GraphQL Playground. Есть ли способ сделать это с конечной точки? (Я не хочу касаться внутреннего устройства KeystoneJS, просто обращайтесь к схеме через конечную точку)

1 ответ

Решение

Вы можете запустить запрос самоанализа для любой службы GraphQL (при условии, что они не отключили интроспекцию - некоторые сервисы делают это в производственной среде). Результат этого запроса можно передать вbuildClientSchemaдля восстановления схемы на основе результата самоанализа (естественно, без какой-либо логики разрешения полей). Затем вы можете преобразовать возвращенный объект GraphQLSchema в SDL, вызвавprintSchema.

Вот пример использования 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)

Примечание: первые "данные" - это то, что API axios вызывает фактический ответ JSON от сервера, а вторые "данные" - это фактическое свойство "данных", которое мы хотим передать buildClientSchema.

Другие вопросы по тегам