#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",