Легко перейти на 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?

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

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

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