我正在尝试通过另一个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
}
}
}
我收到的错误是:
‘Query does not pass validation. Violations:\n\nField \’page_title\’
of type \’Json\’ must not have a sub selection. (line 3, column 5):\n
page_title {\n ^’ } },
奇怪的是,如果我在没有嵌套文本字段的情况下硬编码查询,我可以获得有效的响应,因为错误在服务器上显示如下:
// const query = gql`${context.request.body.query}`;
const query = gql`
query($uid: String!) {
page(lang: "en-gb", uid: $uid) {
page_title
}
}
`;
试图在graphql playground中修改我的查询,使其不包含嵌套文本字段,如下所示:
query {
page(lang: "en-gb", uid: "homepage") {
page_title
}
}
给我以下错误,并且不允许我提出请求:
field “page_title” of type “[TextField]” must have a selection of
subfields. Did you mean “page_title { … }”?
该错误表明我需要添加预期的文本的嵌套子字段,但是当我使用此查询而不是服务器上的硬编码时,它会给出前面提到的错误.
不知道我的设置中某处出错了吗?
谢谢
最佳答案 在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.因此,您不能对此请求使用相同的查询.