我正在编写一个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来说并没有似乎不是
我对GraphQL相对较新,因此在这一点上我迷失了方向。也许我能以某种方式获得原始的GraphQL查询和其他有用的信息“更进一步的上游”并将其放置在context
中?
由于任务的定义,可能是:建立一个在GraphQL前端和另一个GraphQL服务器之间接口的GraphQL服务器-我只需要接受样板,或者可能是因为我我错过了令人眼花obvious乱的明显。
对于它的价值,我对上游服务器(即KeystoneJS服务器)没有控制权,所以就我所知,诸如Apollo Federation之类的东西在这里无法工作。 / p>