Я пишу сервер 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 это не так
Я относительно новичок в GraphQL, так что в данный момент я немного растерялся, как идти по этому пути. Возможно, я мог бы каким-то образом получить исходный запрос GraphQL и другую полезную информацию «дальше по течению» и поместить его в context
?
Возможно, из-за определения задачи: настроить GraphQL сервер, который взаимодействует между фронтом GraphQL и другим сервером GraphQL - я просто должен принять шаблон, или, может быть, мне не хватает ослепительно очевидного.
Для чего бы то ни было, у меня есть нет контроля над вышестоящим сервером, то есть сервером Keystone JS, поэтому такие вещи, как Федерация Аполлона, не будут (насколько я знаю ) работа здесь.