Как мне создать удаленную исполняемую схему из API github graphql? - PullRequest
0 голосов
/ 20 января 2019

Вот ситуация, я пытаюсь сшить схему GitHub graphql с локальной схемой приложения. Приложение использует GitHub oAuth для подключения пользователя к его данным GitHub.

Большинство описаний при сшивании схемы используют запрос introspection для получения схемы удаленного сервера. К сожалению, GitHub graphql api аутентифицируется токеном доступа. Моим первоначальным намерением было использовать токен доступа oAuth пользователя для выполнения самоанализа, но затем я столкнулся с ловушкой-22, в которой самоанализ должен произойти при запуске, то есть до того, как у меня будут какие-либо аутентифицированные пользователи.

Итак, основной вопрос: Как мне создать удаленную исполняемую схему из github graphql api?

1 Ответ

0 голосов
/ 20 января 2019

Дальнейшее изучение этой темы показало, что лучшим вариантом является статическая загрузка схемы удаленного сервера, а затем создание из нее удаленного исполняемого файла.

Сначала вам нужно установить apollo cli:

$ npm install -g apollo

Затем используйте его для загрузки схемы GitHub:

$ apollo schema:download --header "Authorization: Bearer token"
  --endpoint=https://api.github.com/graphql github.json

где token - строка без кавычек, содержащая токен доступа к GitHub (я только что использовал токен oAuth из своей учетной записи). На момент написания статьи этот json был длиной 47112 строк, когда он был симпатичным.

Этот файл можно поместить в любое место приложения, из которого можно импортировать. Например, в том же каталоге, что и код, который будет составлять из него схему, которая приведена ниже:

Код импорта :

import { HttpLink } from 'apollo-link-http';
import { setContext } from 'apollo-link-context';
import { makeRemoteExecutableSchema } from 'apollo-server';
import { printSchema, buildClientSchema } from 'graphql/utilities';
import fetch from 'node-fetch';

Импорт фактической схемы

Обратите внимание, что вы можете получить доступ к частям файла json напрямую через деструктуризацию объекта

import { __schema } from './github.json';

Сборка клиентской схемы и ввод типов по умолчанию

Поверь мне, тебе нужны оба из них. И да, вы все равно собираетесь использовать это на сервере , даже если он говорит buildClient (ваш сервер в конечном итоге станет клиентом сервера GitHub)

const schema = buildClientSchema({ __schema });
const typeDefs = printSchema(schema);

Настроить ссылку

Это будет использоваться для реальных запросов. В этом примере я несу пользователя и его / ее accessToken по ссылке context , которая придет откуда-то еще.

const http = new HttpLink({ uri: 'https://api.github.com/graphql', fetch });
const link = setContext((request, previousContext) => {
  const { user } = previousContext;
  const { accessToken } = user;
  return { headers: { Authorization: `Bearer ${accessToken}` } };
}).concat(http);

Наконец, создайте схему удаленного выполнения

const ghSchema = makeRemoteExecutableSchema({
  schema,
  typeDefs,
  link,
});

export default ghSchema;

ghSchema будет экземпляром GraphQLSchema , который теперь можно использовать напрямую или сшивать с другими схемами, используя mergeSchemas

h / t до bessey за его комментарий к запросу функции Apollo , который наконец-то привел меня к яркости.

...