是否可以从可执行模式中获取类型定义?
Is it possible to get type defs from an executable schema?
拥有一个微服务架构,我希望 API 即使某些微服务已关闭也是完整的。我知道这个问题可以通过适当的编排来解决,但我很想知道是否可以仅使用代码来处理这种情况。
问题:
我有 3 个微服务:核心、A、B。如果我启动核心而 A 已关闭,我需要核心才能成功启动并包含 A 的 api。为了实现这一点,我尝试从每个远程 GraphQL 模式获取类型定义并将它们存储在 etcd 或其他地方,并在服务无法访问时用于创建可执行模式,因此无法访问其模式。
如果在核心中我只能通过 apollo 获取可执行模式,我该怎么做 link。
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 等...这些 return 是对象而不是字符串定义。是否有可能获取 typeDef 并存储它们。我不想存储整个可执行模式,因为这可能会带来安全问题,因为解析器将存储在数据库中。
我不想使用内省,因为它将在生产中被禁用,也不希望每个微服务独立发送它的 typeDef
好的,经过一番挖掘,我找到了使用 graphql/utilities
中的 printSchema
的解决方案
import { printSchema } from 'graphql/utilities';
const typeDefs = printSchema(schema);
拥有一个微服务架构,我希望 API 即使某些微服务已关闭也是完整的。我知道这个问题可以通过适当的编排来解决,但我很想知道是否可以仅使用代码来处理这种情况。
问题:
我有 3 个微服务:核心、A、B。如果我启动核心而 A 已关闭,我需要核心才能成功启动并包含 A 的 api。为了实现这一点,我尝试从每个远程 GraphQL 模式获取类型定义并将它们存储在 etcd 或其他地方,并在服务无法访问时用于创建可执行模式,因此无法访问其模式。
如果在核心中我只能通过 apollo 获取可执行模式,我该怎么做 link。
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 等...这些 return 是对象而不是字符串定义。是否有可能获取 typeDef 并存储它们。我不想存储整个可执行模式,因为这可能会带来安全问题,因为解析器将存储在数据库中。
我不想使用内省,因为它将在生产中被禁用,也不希望每个微服务独立发送它的 typeDef
好的,经过一番挖掘,我找到了使用 graphql/utilities
printSchema
的解决方案
import { printSchema } from 'graphql/utilities';
const typeDefs = printSchema(schema);