【问题标题】:Graphql error on subfields with graphql-yoga带有graphql-yoga的子字段上的Graphql错误
【发布时间】:2019-05-08 15:59:07
【问题描述】:

我正在尝试通过另一个 graphql API 的代理查询一个 graphql API,并且收到一个错误。我正在为我的服务器使用 graphql yoga 并从 CMS 连接到另一个 graphql API。这是我的代码:

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 Yoga 附带的 graphql playground 上的查询:

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

我收到的错误是:

'查询未通过验证。违规:\n\n字段\'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
  }
}

给我以下错误,根本不允许我提出请求:

“[TextField]”类型的字段“page_title”必须选择 子字段。您是说“page_title { ... }”吗?

该错误表明我需要添加 text 的嵌套子字段,这是有意的,但是当我使用此查询而不是服务器上的硬编码查询时,它会给我前面提到的错误。

不确定我的设置是否有问题?

谢谢

【问题讨论】:

  • 我觉得这与解析器有关。以后我会自己尝试一些东西。
  • 尝试改变 typeDef type Query { page(lang: String, uid: String): Page } type findPage { page(lang: String, uid: String): Page }
  • Nope nvm...lol 让我多想一下我开枪了。
  • 请查看我的回答,有用吗?

标签: javascript node.js graphql prismic.io


【解决方案1】:

在您的 GraphQL 架构中 page_title: [TextField] 不是 Scalar Types 之一

因此,在进行查询期间,您需要定义需要获取的确切字段? 并且查询中的字段应该扩展到只有标量类型的级别,这样 GraphQL 就会知道如何解析您的查询。

所以这是唯一应该来自第一级的查询(来自 Graphql Yoga 附带的 graphql playground):

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

但是来自服务器的错误是您在 graphql 解析器中进行 graphql 查询的方法引发的:

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

所以我 100% 确定 Prismic 中的 page_title 具有自定义标量 - JSON。因此,您不能对该请求使用相同的查询。

【讨论】:

    猜你喜欢
    • 2019-03-13
    • 2021-04-06
    • 1970-01-01
    • 2019-05-30
    • 2020-09-12
    • 2019-06-11
    • 2019-05-16
    • 2018-09-06
    • 2019-09-27
    相关资源
    最近更新 更多