Доступ к Postgraphile (как к библиотеке) с помощью клиента Apollo с того же сервера

У меня есть postgraphile, работающий на экспресс-сервере (как библиотека)

export const postGraphileServer = () => {
  return postgraphile(process.env.DB_DSN, 'public', options);
};

Выражать:

app.use(postGraphileServer());

Используя плагин для самоанализа codegen, я генерирую graphql.schema.json, и все работает правильно, когда доступ к GQL осуществляется извне через http-ссылку. yml-фрагмент:

  packages/graphql/src/generated/graphql.schema.json:
    plugins:
      - 'introspection'

У меня есть вариант использования для предоставления конечной точки REST на экспресс-сервере, который будет принимать полезную нагрузку и создавать строку в Postgres. Что я хотел бы сделать, так это получить доступ к Postgraphile напрямую (без сетевого перехода), чтобы избежать аутентификации - я считаю, что использую только схему

Из того, что я читал, это можно сделать через SchemaLink. Я пробовал что-то вроде:

const clientSchema = buildClientSchema(schema as unknown as IntrospectionQuery);

// Make executable schema from client schema
const executableSchema = makeExecutableSchema({
  typeDefs: clientSchema,
});

return (this.#_apolloClient = new ApolloClient({ 
  ssrMode: true,
  link: new SchemaLink({ schema: executableSchema }),
  cache: new InMemoryCache(),
}));

Где schema — это сгенерированный codegen файл graphql.schema.json. Я считаю, что проблема, которая у меня есть, заключается в том, что мне также нужно передать распознаватели makeExecutableSchema, чтобы Postgraphile знал, как запрашивать/мутировать - в настоящее время он молча терпит неудачу, но ничего не делает.

Я на правильном пути и есть ли способ получить доступ к сгенерированным распознавателям из postgraphile (или мне нужно вручную создать их для этого конкретного случая использования?)

Это может помочь: github.com/graphile/starter/blob/main/%40app/lib/src/…

Benjie 30.03.2023 19:51

Спасибо! Я думаю, что это дает мне то, что мне нужно. Я обновлю ответ, как только у меня будет очищенный образец

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

Ответы 1

Ответ принят как подходящий

Итак, с помощью Бенджи я смог заставить это работать, используя GraphileApolloLink.ts. Поскольку эта ссылка захватывает контекст и схему из самого промежуточного программного обеспечения, нет необходимости пытаться построить схему из schema.graphql.json файла самоанализа.

Мои требования немного отличались, поэтому я убрал проверку мутации внутри GraphileApolloLink.ts.

Для полноты мне удалось инициализировать ApolloClient просто

get #apolloClient(): ApolloClient<NormalizedCacheObject> {
  if (this.#_apolloClient) {
    return this.#_apolloClient;
  }

  const _link = new GraphileApolloLink({
    req: this.request,
    res: this.response,
    // Getter for the middleware object passed into Express
    postgraphileMiddleware: postGraphileMiddleware(),
  });

  return (this.#_apolloClient = new ApolloClient({
    ssrMode: true,
    link: _link,
    cache: new InMemoryCache(),
  }));
}

И запросите данные успешно, используя запросы/мутации, сгенерированные codegen, как и ожидалось.

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