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-клиенту не следует об этом думать - это должно выполняться на стороне сервера.
Есть несколько методов, которые можно использовать для решения этой проблемы на стороне сервера:
Сшивание схемы - это простой подход к решению вашей проблемы - возьмите свою старую схему и объедините ее со схемой PostGraphile; таким образом, когда клиенты связываются с /graphql, они имеют доступ к обеим схемам. Затем вы можете пометить все в своей старой схеме как устаревшее и постепенно отказываться от использования. Однако, если вы можете, я бы порекомендовал вам использовать плагин 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