是否可以从可执行模式中获取类型def?

时间:2018-08-20 13:45:21

标签: microservices apollo graphql-js

具有微服务架构,即使某些微服务已关闭,我也希望API完整。我知道可以通过适当的编排解决此问题,但是我很想知道是否有可能仅使用代码来处理这种情况。

问题:

我有3个微服务:核心,A,B。如果我启动核心而A关闭,则需要核心才能成功启动并包含A的api。为了实现这一点,我尝试从每个远程GraphQL模式中获取类型定义,并将它们存储在etcd或其他位置,并在服务无法访问以及因此无法访问其模式时用于创建可执行模式。

如果在内核中我只能通过阿波罗链接获取可执行模式,该怎么办。

const getRemoteSchema = async ({ uri, name }) => {
  const link = setContext((request, previousContext) => ({
    headers: {
      context: `${JSON.stringify(previousContext.graphqlContext || {})}`,
    },
  })).concat(new HttpLink({ uri, fetch }));

  let schema = await introspectSchema(link).catch(error => new ApolloError(error.message, 'INTERNAL_SERVER_ERROR', error));

  if (schema instanceof ApolloError) // do something

如果我没有记错的话,我只能在获取的架构上调用以下方法:getQueryType,getTypeMap等...这些方法返回的对象不是字符串定义。是否可以获取typeDefs并将其存储。我不想存储整个可执行模式,因为这可能会带来安全问题,因为解析程序将存储在数据库中。

我不想使用自省功能,因为它将在生产中被禁用,也不希望每个微服务都独立发送其typeDefs

1 个答案:

答案 0 :(得分:2)

好吧,经过一番挖掘,我找到了使用printSchema中的graphql/utilities的解决方案

import { printSchema } from 'graphql/utilities';
const typeDefs = printSchema(schema);