有没有办法将到达Apollo服务器的GraphQL查询传递给另一台Apollo服务器?

有没有办法将到达Apollo服务器的GraphQL查询传递给另一台Apollo服务器?,graphql,apollo,graphql-js,apollo-server,keystonejs,Graphql,Apollo,Graphql Js,Apollo Server,Keystonejs,我正在编写一个Apollo服务器,它是Apollo客户端前端和各种后端API之间的GraphQL接口,其中一些是REST,一些是GraphQL 目前有一个GraphQL后端,一个KeystoneJS CMS 我发现自己编写了大量的样板文件来将从前端接收到的GraphQL查询(即,变异或查询)传递到后端。例如,获取我的Keystone CMS中的所有文章条目 type Query { allArticles( where: ArticleWhereInput search: S

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

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

我发现自己编写了大量的样板文件来将从前端接收到的GraphQL查询(即,变异或查询)传递到后端。例如,获取我的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;
        }
    }
async getArticles(其中:ArticleWhereInput,
搜索:字符串,
orderBy:String,
第一:数字,
跳过:数字):承诺{
试一试{
const response=wait this.query(ARTICLES\u query{
查询:文章查询,
变量:{where,search,orderBy,first,skip}
});
返回response.data.allArticles;
}捕获(错误){
控制台错误(error);
返回null;
}
}
它工作得很好,但您可以看到它变得很麻烦,尤其是当CMS发生变化时。我想知道是否有办法简化流程

我认为可能原始的GraphQL查询被传递到解析器,并且在某种程度上我可以将其传递到数据源并稍微“自动化”该过程,但从另一个角度看,它似乎不是这样

我对GraphQL比较陌生,所以在这一点上我对如何沿着这条大道前进有点迷茫。也许我可以以某种方式获得原始的GraphQL查询和其他有用的信息“更上游”,并将其放在
上下文中

可能是——由于任务的定义:要建立一个GraphQL服务器,在GraphQL前端和另一个GraphQL服务器之间进行接口——我只需要接受样板文件,或者可能是我忽略了显而易见的东西


值得一提的是,我无法控制上游服务器,即KeystoneJS服务器,因此Apollo Federation之类的东西(据我所知)在这里不起作用。

听起来你想进行模式缝合。模式缝合已被弃用,取而代之的是联合,但仍作为一个单独的分支进行维护。@DanielRearden——工作得非常出色!这节省了很多时间和精力我认为,尽管它已被弃用,但将来不会被淘汰。我应该从fork,
graphql工具fork
,而不是从
graphql工具
,导入
makeExecutableSchema
,等等吗?是的——fork正在被积极维护,而原始库的维护者不接受任何PRs来修复与模式缝合相关的问题。