Ошибка 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. В результате вы не можете использовать один и тот же запрос для этого запроса.

Другие вопросы по тегам