Ошибка Graphql на подполях с graphql-yoga
Я пытаюсь запросить API GraphQl через прокси другого API GraphQL, и я получаю сообщение об ошибке. Я использую graphql yoga для своего сервера и подключаюсь к другому API GraphQl из CMS. Вот мой код:
server.js
const { GraphQLServer } = require('graphql-yoga');
const Prismic = require('./prismic.config.js');
const gql = require('graphql-tag');
const typeDefs = `
type Query {
page(lang: String, uid: String): Page
}
type Page {
page_title: [TextField]
}
type TextField {
text: String
}
`
const resolvers = {
Query: {
page: (parent, args, context, info) => {
const query = gql`${context.request.body.query}`;
const result = context.Prismic.query({
query,
variables: { ...args }
})
.then(resp => {
return resp.data.page;
})
.catch(err => console.log(err));
return result;
}
}
}
const server = new GraphQLServer({
typeDefs,
resolvers,
context: req => ({ ...req, Prismic })
})
server.start(() => console.log('Server is running on localhost:4000'))
Вот мой запрос ниже с детской площадки graphql, которая поставляется с Graphql Yoga:
query {
page(lang: "en-gb", uid: "homepage") {
page_title {
text
}
}
}
Я получаю ошибку:
"Запрос не проходит проверку. Нарушения:\n\nField \'page_title\' типа \'Json\' не должен иметь вложенного выбора. (строка 3, столбец 5):\n page_title {\n ^' } },
Странно то, что я могу получить правильный ответ, если я жестко закодировал запрос без вложенного text
поле, как предполагает ошибка на сервере, вот так:
// const query = gql`${context.request.body.query}`;
const query = gql`
query($uid: String!) {
page(lang: "en-gb", uid: $uid) {
page_title
}
}
`;
Попытка изменить мой запрос на площадке Graphql, чтобы не включать вложенный text
поле вроде так:
query {
page(lang: "en-gb", uid: "homepage") {
page_title
}
}
Выдает следующую ошибку и вообще не позволяет мне сделать запрос:
Поле "page_title" типа "[TextField]" должно иметь выбор подполей. Вы имели в виду "page_title { ... }"?
Ошибка предполагает, что мне нужно добавить вложенное подполе text
который предназначен, но когда я использую этот запрос вместо жестко заданного на сервере, он дает мне ошибку, упомянутую ранее.
Не уверен, что я ошибся где-то в моей настройке?
Спасибо
1 ответ
В вашей схеме GraphQL page_title: [TextField]
это не один из скалярных типов
В результате при создании запроса вам нужно определить, какие именно поля вам нужно выбрать? И ваши поля в запросе должны быть расширены до уровня наличия только скалярных типов, чтобы GraphQL знал, как разрешить ваш запрос.
Так что это единственный запрос, который должен быть с первого уровня (с площадки Graphql, которая поставляется с Graphql Yoga):
query {
page(lang: "en-gb", uid: "homepage") {
page_title {
text
}
}
}
Но ошибка сервера вызывает ваш подход к выполнению запроса graphql внутри resolver graphql:
const result = context.Prismic.query({
query,
variables: { ...args }
})
Так что я на 100% уверен, что page_title
в Prismic есть собственный скаляр - JSON. В результате вы не можете использовать один и тот же запрос для этого запроса.