在这种情况下,我正在尝试使用应用程序的本地模式 stitch GitHub graphql模式。该应用程序使用GitHub oAuth将用户连接到他们的GitHub数据。
大多数关于模式缝合的文章都使用 introspection 查询来获取远程服务器的模式。不幸的是,GitHub graphql api已通过访问令牌进行身份验证。我最初的意图是使用用户的oAuth访问令牌执行自省,但是随后我遇到了catch 22,其中自省需要在启动时进行,即在我拥有任何经过身份验证的用户之前。
所以基本问题是:如何从github graphql api创建远程可执行模式?
答案 0 :(得分:1)
对该主题的进一步阅读显示,更好的模式是静态下载远程服务器的模式,然后从中创建一个远程可执行文件。
首先,您需要安装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';
构建客户端架构和typeDefs
相信我,您需要这两个。是的,即使它显示 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换来他的comment on an Apollo feature request,这终于使我兴奋了。