有没有办法将到达Apollo服务器的GraphQL查询传递给另一台Apollo服务器?
我正在编写一个Apollo服务器,它是Apollo客户端前端和各种后端API之间的GraphQL接口,其中一些是REST,一些是GraphQL 目前有一个GraphQL后端,一个KeystoneJS CMS 我发现自己编写了大量的样板文件来将从前端接收到的GraphQL查询(即,变异或查询)传递到后端。例如,获取我的Keystone CMS中的所有有没有办法将到达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
文章
条目
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来修复与模式缝合相关的问题。