我正在尝试通过另一个graphql API的代理查询graphql API,并收到错误消息。我正在为服务器使用graphql Yoga,并从CMS连接到另一个graphql API。这是我的代码:
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游乐场的查询:
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
的嵌套子字段,但是当我使用此查询而不是服务器上的硬编码查询时,它给了我前面提到的错误。
不确定我的设置是否出错了?
谢谢
答案 0 :(得分:2)
在您的GraphQL模式中
page_title: [TextField]
不是Scalar Types
因此,在进行查询时,您需要定义需要准确获取哪些字段? 并且您在查询中的字段应扩展到仅具有标量类型的级别,因此GraphQL将知道如何解决您的查询。
因此,这是唯一应该来自第一级的查询(来自Graphql Yoga附带的graphql游乐场):
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。因此,您不能对此请求使用相同的查询。