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

Posted

技术标签:

【中文标题】是否可以从可执行模式中获取类型定义?【英文标题】:Is it possible to get type defs from an executable schema? 【发布时间】:2019-01-26 15:57:30 【问题描述】:

拥有一个微服务架构,即使某些微服务出现故障,我也希望 API 是完整的。我知道这个问题可以通过适当的编排来解决,但我很感兴趣是否可以仅使用代码来处理这种情况。

问题:

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

如果在核心中我只能通过 apollo 链接获取可执行模式,我该怎么做。

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】:

好的,经过一番挖掘,我发现了使用printSchema from graphql/utilities的解决方案

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

【讨论】:

以上是关于是否可以从可执行模式中获取类型定义?的主要内容,如果未能解决你的问题,请参考以下文章

从可修订版获取模型“identifiableName()”

是否可以在 postgresql 的另一个模式中使用一个模式的枚举类型

Solr模式:在不使用模式类型定义时更新是否安全?

将类从可执行文件导出到 dll

是否可以从可搜索的 PDF 访问文本覆盖?

是否可以标记特定方法模式以返回特定类型?