带有graphql-yoga的子字段上的Graphql错误
Posted
技术标签:
【中文标题】带有graphql-yoga的子字段上的Graphql错误【英文标题】:Graphql error on subfields with graphql-yoga 【发布时间】: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
的嵌套子字段,这是有意的,但是当我使用此查询而不是服务器上的硬编码查询时,它会给我前面提到的错误。
不确定我的设置是否有问题?
谢谢
【问题讨论】:
我觉得这与解析器有关。以后我会自己尝试一些东西。 尝试改变 typeDeftype Query page(lang: String, uid: String): Page
type findPage page(lang: String, uid: String): Page
Nope nvm...lol 让我多想一下我开枪了。
请查看我的回答,有用吗?
【参考方案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。因此,您不能对该请求使用相同的查询。
【讨论】:
以上是关于带有graphql-yoga的子字段上的Graphql错误的主要内容,如果未能解决你的问题,请参考以下文章
在没有中继的情况下使用带有graphene-django的子字段中的参数进行分页