Беспрепятственный переход на Postgraphile (несколько экземпляров ApolloClient)

Postgraphile кажется очень удобным инструментом, но у меня уже есть десятки запросов и изменений на стороне клиента и сервера.

Есть ли способ интегрировать Postgraphile по частям, имея мою старую схему GraphQL, описанную руками?

Итак, теперь у меня есть следующий код инициализации:

function createApolloLink(){
  return createHttpLink({
    uri: '/graphql',
    credentials: 'same-origin'
  });
}

function create(){
  return new ApolloClient({
    link: createApolloLink(),
    ssrMode: !process.browser, // eslint-disable-line
    cache: new InMemoryCache(),
    connectToDevTools: process.browser
  });
}

Как использовать одно нормализованное хранилище (на стороне клиента) и подключиться ко второй точке API, управляемой Postgraphile, например /graphql2?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Что такое Apollo Client и зачем он нужен?
Что такое Apollo Client и зачем он нужен?
Apollo Client - это полнофункциональный клиент GraphQL для JavaScript-приложений, который упрощает получение, управление и обновление данных в...
1
0
891
1

Ответы 1

Обычно вашему 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 Link, который будет переключаться автоматически в зависимости от директивы клиента или даже имени поля.

https://github.com/apollographql/apollo-link/tree/master/packages/apollo-link-http#context

Другие вопросы по теме