Как загрузить схему GraphQL из двух исходных местоположений с помощью graphql-tools?

#typescript #graphql #graphql-tools

#typescript #graphql #graphql-tools

Вопрос:

Я хочу загружать схемы 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
}
 

Любой намек на то, в чем может быть проблема?

Комментарии:

1. Вы уверены, что определили GetExternalConfluencePage тип в .graphql файле во втором местоположении, а не использовали его? Мы не можем воспроизвести вашу ошибку, не увидев код .graphql файла

2. Спасибо. Я добавил файл .graphql в вопрос.

3. Использует ли локальная схема тип ввода GetExternalConfluencePage , определенный в общей схеме?

4. Вероятно, это потому, что мне не хватает понимания (я новичок в GraphQL). Я думал, что после определения в любом файле .graphql я могу использовать определение ввода везде. Я попытался переместить определение externalConfluencePage в файл common .graphql с помощью команды «extend type Query», но затем сообщение об ошибке «Ошибка: 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",