Как правило, вашему клиенту GraphQL не нужно об этом думать - его следует обрабатывать на стороне сервера.
Существует ряд методов, которые можно использовать для решения этой проблемы на стороне сервера:
Схема сшивания
Схема сшивания - простой подход к вашей проблеме - возьмите старую схему и объедините ее с вашей схемой PostGraphile;таким образом, когда клиенты общаются с /graphql
, они имеют доступ к обеим схемам.Затем вы можете пометить все в старой схеме как устаревшее и постепенно прекратить использование.Однако, если вы можете, я бы порекомендовал вам использовать плагин PostGraphile ...
Плагин PostGraphile
PostGraphile построен на основе системы плагинов, и вы можете использовать что-то вроде makeExtendSchemaPlugin
, чтобы смешать вашу старую схему GraphQL с PostGraphile.Это задокументировано здесь: https://www.graphile.org/postgraphile/make-extend-schema-plugin/, но если ваши старые типы / преобразователи реализованы с помощью чего-то вроде graphql-tools
, это, вероятно, самый простой способ начать работу:
const { makeExtendSchemaPlugin, gql } = require('graphile-utils');
const typeDefs = gql`\
type OldType1 {
field1: Int!
field2: String
}
extend type Query {
oldField1: OldType1
oldField2: OldType2
}
`;
const resolvers = {
Query: {
oldField1(/*...*/) {
/* old logic here */
},
//...
},
};
const AddOldSchemaPlugin = makeExtendSchemaPlugin(
build => ({
typeDefs,
resolvers,
})
);
module.exports = AddOldSchemaPlugin;
Это также приведет клучшая производительность, поскольку не должно быть добавленной задержки, и вы снова можете пометить устаревшие поля / мутации как устаревшие.
Делегирование схемы
Используя этот подход, вы создаете свою собственную новую схему GraphQL, которая затем«делегирует» другим схемам GraphQL (устаревшей и созданной PostGraphile).Это добавляет небольшую задержку, но дает вам гораздо больший контроль над окончательной формой вашей схемы GraphQL, хотя с этой возможностью возникает большая ответственность - если вы сделаете опечатку, вам придется поддерживать эту опечатку в течение длительного времени!Лично я предпочитаю подход сгенерированной схемы, используемый PostGraphile.
Однако, чтобы ответить на ваш вопрос по запросу, Apollo Link имеет функцию «контекста», которая позволяет вам изменять способ выполнения запроса.Обычно это используется для добавления заголовков, но вы также можете использовать его для переопределения URI, чтобы определить, куда может идти запрос.Я никогда не делал этого сам, но я не удивлюсь, если бы была ссылка Apollo, которую вы можете использовать, которая будет автоматически переключаться в зависимости от клиентской директивы или даже от имени поля.
https://github.com/apollographql/apollo-link/tree/master/packages/apollo-link-http#context