У меня проблемы с объединением удаленных схем. За основу я взял пакет Apollo GraphQL, упомянутый в руководстве (https://www.apollographql.com/docs/tutorial/introduction/). Я хочу создать прототип следующей архитектуры:
- 2 службы
- 1 шлюз, который делегирует запросы этим службам
- Я не хочу использовать решения как Apollo Федерация
- Я хочу использовать шаблон разделения проблем
Вот определение базового типа для двух служб:
Схема компании:
type Query {
company: Company
}
type Company {
id: ID!
name: String
}
Схема i18n:
type Query {
i18n: I18N
}
type I18N {
id: ID!
username: String
}
type Company {
id: ID!
i18n(id: ID): I18N
}
Службы реализуют соответствующие преобразователи. Шлюз генерирует удаленные схемы для этих сервисов и пытается их объединить. И это то, что вызывает некоторые проблемы
const schema = mergeSchemas({
schemas: [executableI18NSchema, executableCompanySchema],
});
Первая проблема заключается в том, что кажется, что порядок схем в массиве имеет значение. Если исполняемый файлCompanySchema - последний элемент, я могу правильно запросить данные компании. Как только я перемещаю его в первую позицию, я получаю сообщения типа «Невозможно запросить поле name
для типа Company
, потому что mergeSchemas
берет typeDefs только из последнего элемента массива и отменяет один раз из предыдущего. Я бы ожидайте, что функция слияния правильно объединит данные схемы.
Итак, я провел небольшое исследование и обнаружил, что функция stitchSchemas существует в более поздней версии graphql-tools. Поэтому я обновил их до последней версии и прямо сейчас stitchSchemas, но также mergeSchemas возвращают ожидаемый typeDefs et c. для объединенной схемы. Похоже, я добился некоторого прогресса, но как только я пытаюсь сделать запрос запроса в Playground, я получаю сообщение об ошибке: максимальный вызов превышен размер стека. Таким образом, сервер Apollo несовместим с последней версией graphql-tools.
Есть мысли или идеи?