Есть ли способ передать запрос GraphQL, поступающий на сервер Apollo, на другой сервер Apollo? - PullRequest
0 голосов
/ 16 марта 2020

Я пишу сервер Apollo, который является интерфейсом GraphQL между моим клиентом Apollo и множеством бэкэнд-API, некоторые из которых являются REST, а некоторые - GraphQL.

На данный момент существует один бэкэнд GraphQL, Keystone JS CMS.

Я пишу шаблон lot для передачи запроса GraphQL (то есть мутации или запроса), который я получаю с фронта на сервер. Например, чтобы получить все Article записей в моей Keystone CMS

type Query {
  allArticles(
    where: ArticleWhereInput
    search: String
    orderBy: String
    first: Int
    skip: Int
  ): [Article]

, я получаю запрос в моем преобразователе интерфейса

// resolver.js
Query: {
        allArticles: (_, args, { dataSources }) => {
            const { where, search, orderBy, first, skip } = args || {};
            return dataSources.gqlApi.getArticles(where, search, orderBy, first, skip);
        },

, а затем передаю его в свой источник данных GraphQL

import { GraphQLDataSource } from 'apollo-datasource-graphql';
import { gql } from 'apollo-server';
import { Proposal, Article, Tag, ArticleWhereInput, TagWhereInput } from '../types/keystone';

const ARTICLES_QUERY = gql`
  query allArticles( $where: ArticleWhereInput
     $search: String
     $orderBy: String
     $first: Int
     $skip: Int) {
    allArticles(where: $where
     search: $search
     orderBy: $orderBy
     first: $first
     skip: $skip) {
      title
      text
      id

    }
  }
`;

где у меня есть метод, который распознаватель вызывает

async getArticles(where: ArticleWhereInput,
                         search: String,
                         orderBy: String,
                         first: number,
                         skip: number): Promise<[Article]> {
        try {
            const response = await this.query(ARTICLES_QUERY, {
                query: ARTICLES_QUERY,
                variables: { where, search, orderBy, first, skip }
            });

            return response.data.allArticles;
        } catch (error) {
            console.error(error);
            return null;
        }
    }

Он работает нормально, но вы можете видеть, что он становится громоздким, особенно при изменении CMS. Мне было интересно, есть ли способы упростить процесс.

Я подумал, что, возможно, исходный запрос GraphQL передается распознавателю, и что в некотором смысле я мог бы просто передать его источнику данных и «автоматизировать». процесс немного, но из документов Apollo Server это не так

enter image description here

Я относительно новичок в GraphQL, так что в данный момент я немного растерялся, как идти по этому пути. Возможно, я мог бы каким-то образом получить исходный запрос GraphQL и другую полезную информацию «дальше по течению» и поместить его в context?

Возможно, из-за определения задачи: настроить GraphQL сервер, который взаимодействует между фронтом GraphQL и другим сервером GraphQL - я просто должен принять шаблон, или, может быть, мне не хватает ослепительно очевидного.

Для чего бы то ни было, у меня есть нет контроля над вышестоящим сервером, то есть сервером Keystone JS, поэтому такие вещи, как Федерация Аполлона, не будут (насколько я знаю ) работа здесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...