Дальнейшее изучение этой темы показало, что лучшим вариантом является статическая загрузка схемы удаленного сервера, а затем создание из нее удаленного исполняемого файла.
Сначала вам нужно установить 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 , который наконец-то привел меня к яркости.