有什么方法可以将到达Apollo Server的GraphQL查询传递到另一个Apollo Server?

时间:2020-03-16 15:07:28

标签: graphql apollo graphql-js apollo-server keystonejs

我正在编写一个Apollo服务器,它是我的Apollo客户端前端和各种后端API之间的GraphQL接口,其中一些是REST,其中一些是GraphQL。

目前有一个GraphQL后端,即KeystoneJS CMS。

我发现自己写了一个 lot 样板,以将我从前端收到的GraphQL查询(即变异或查询)传递给后端。例如,要获取我的Keystone CMS中的所有Article条目

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 docs来说并没有似乎不是

enter image description here

我对GraphQL相对较新,因此在这一点上我迷失了方向。也许我能以某种方式获得原始的GraphQL查询和其他有用的信息“更进一步的上游”并将其放置在context中?

由于任务的定义,可能是:建立一个在GraphQL前端和另一个GraphQL服务器之间接口的GraphQL服务器-我只需要接受样板,或者可能是因为我我错过了令人眼花obvious乱的明显。

对于它的价值,我对上游服务器(即KeystoneJS服务器)没有控制权,所以就我所知,诸如Apollo Federation之类的东西在这里无法工作。 / p>

0 个答案:

没有答案