Ошибка Graphql на подполях с graphql-yoga - PullRequest
0 голосов
/ 07 декабря 2018

Я пытаюсь запросить 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
    }
  }
}

Ошибка i 'm получение:

'Запрос не проходит проверку.Нарушения: \ 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 Ответ

0 голосов
/ 10 декабря 2018

В вашей схеме GraphQL page_title: [TextField] не является одним из Скалярных типов

В результате во время выполнения запроса вам нужно определить, какие именно поля вам нужно выбрать?И ваши поля в запросе должны быть расширены до уровня наличия только скалярных типов, поэтому GraphQL будет знать, как разрешить ваш запрос.

Так что это единственный запрос, который должен быть с первого уровня (из graphqlигровая площадка, которая поставляется с Graphql Yoga):

query {
  page(lang: "en-gb", uid: "homepage") {
    page_title {
     text
    }
  }
}

Но ошибка сервера исходит из вашего подхода к выполнению запроса graphql внутри резолвера graphql:

const result = context.Prismic.query({
      query,
      variables: { ...args }
   })

Так что я на 100%убедитесь, что page_title в Prismic имеет собственный скаляр - JSON.В результате вы не можете использовать один и тот же запрос для этого запроса.

...