【问题标题】:How to load a GraphQL schema from two source locations with graphql-tools?如何使用 graphql-tools 从两个源位置加载 GraphQL 模式?
【发布时间】: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,但不在模式中”指向相同的问题。我必须弄清楚如何在模块中定义一个额外的查询字段并在本地使用它。你有什么暗示吗?

标签: typescript graphql graphql-tools


【解决方案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",

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-01
    • 2021-01-02
    • 2017-08-08
    • 2018-12-14
    • 2019-07-07
    • 2020-12-05
    • 2019-03-22
    • 2021-03-01
    相关资源
    最近更新 更多