如何使用 graphql-tools 从两个源位置加载 GraphQL 模式?

Posted

技术标签:

【中文标题】如何使用 graphql-tools 从两个源位置加载 GraphQL 模式?【英文标题】:How to load a GraphQL schema from two source locations with graphql-tools? 【发布时间】:2021-04-10 09:56:41 【问题描述】:

我想从不同位置(本地应用程序和公共模块)加载 graphql 模式。我愿意:

export function GraphqlServer(
    resolvers: Record<string, IResolvers>,
    config?: Config
) 
    const localScheme = '**/*.graphql';
    const commonSchema = join(
        __dirname,
        './packages/common/src/graphql/api/**/*.graphql'
    );
    const schema = loadSchemaSync([localScheme, commonSchema], 
        loaders: [new GraphQLFileLoader()]
    );

    const schemaWithResolvers = addResolversToSchema(
        schema,
        resolvers: 
            ...resolvers,
            Date,
            DateTime,
            JSON
        
    );

但似乎只加载了第一个位置的模式。我收到一个错误

错误:未知类型“GetExternalConfluencePage”。

在第二个位置的 .graphql 文件中定义。如果我将此文件从第二个位置移动到第一个位置,它将起作用。

.graphql文件的内容是:

input GetExternalConfluencePage 
    confluencePageId: String!


type ExternalConfluencePage 
    title: String!
    body: String!

第一个位置的 .graphql 文件包含:

type Query 
    macro(input: GetMacroInput!): Macro!
    externalConfluencePage(
        input: GetExternalConfluencePage!
    ): ExternalConfluencePage

任何提示可能是什么问题?

【问题讨论】:

您确定在第二个位置的.graphql 文件中定义了GetExternalConfluencePage 类型而不是使用它吗?如果没有看到.graphql文件的代码,我们无法重现您的错误 谢谢。我在问题中添加了 .graphql 文件。 本地模式是否使用通用模式中定义的输入类型GetExternalConfluencePage 这可能是我缺乏理解(我是graphQL的初学者)。我认为一旦在任何 .graphql 文件中定义,我就可以在任何地方使用输入定义。我尝试使用“扩展类型查询”命令将 externalConfluencePage 定义移动到通用 .graphql 文件中,但随后出现错误消息“错误:在解析器中定义的 Query.externalConfluencePage,但不在模式中”指向相同的问题。我必须弄清楚如何在模块中定义一个额外的查询字段并在本地使用它。你有什么暗示吗? 【参考方案1】:

效果很好。

例如

index.ts

import  printSchema  from 'graphql';
import  loadSchemaSync, GraphQLFileLoader  from 'graphql-tools';
import  join  from 'path';

const localScheme = join(__dirname, './local.graphql');
const commonSchema = join(__dirname, './common/*.graphql');
const schema = loadSchemaSync([localScheme, commonSchema], 
  loaders: [new GraphQLFileLoader()],
);

console.log(printSchema(schema));

common/common.graphql:

input GetExternalConfluencePage 
  confluencePageId: String!


type ExternalConfluencePage 
  title: String!
  body: String!

local.graphql:

type Query 
  externalConfluencePage(input: GetExternalConfluencePage!): ExternalConfluencePage

将加载的 GraphQL 模式打印到控制台:

input GetExternalConfluencePage 
  confluencePageId: String!


type ExternalConfluencePage 
  title: String!
  body: String!


type Query 
  externalConfluencePage(input: GetExternalConfluencePage!): ExternalConfluencePage

软件包版本:

"graphql": "^15.4.0",
"graphql-tools": "^6.2.3",

【讨论】:

以上是关于如何使用 graphql-tools 从两个源位置加载 GraphQL 模式?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 graphql-tools 使用或解析枚举类型?

如何使用 graphql-tools 调用查询

无法从 graphql-tools 导入 IResolvers

使用 graphql-tools 打印远程模式时出现 getDirectives 错误

使用 graphql-tools、apollo-link-schema 和 react-hooks 在模拟时总是返回 undefined

“graphql-tools”中的嵌套解析器不起作用