我想用graphql定义一个变种。
我的变异是将对象作为参数。所以我使用GraphQLObjectType在模式和解析器中定义了新的Object。
但是我收到了这个错误:
错误:在解析程序中定义了Agreement.name,但在架构
中没有
有什么想法吗?
这是我的架构定义
const typeDefs = `
type Agreement {
id: Int
}
type Mutation {
agreementsPost(agreement: Agreement) : String
}
`;
这是我的解析器:
const appResolvers = {
Agreement: new GraphQLObjectType({
name: 'Agreement',
fields: {
id: { type: GraphQLInt },
}
}),
Mutation: {
agreementsPost(root, args) {
return axios.post("....").then(res => res.data);
},
}
答案 0 :(得分:6)
这里要解决的事情很多。首先,要将对象用作参数,您必须在模式中将其定义为input
(或GraphQLInputObjectType
) - 您不能使用常规type
(或{{1 }})作为参数。
所以你的类型定义需要看起来像这样:
GraphQLObjectType
如果您已经拥有type Mutation {
agreementsPost(agreement: Agreement): String
}
input Agreement {
id: Int
}
类型,则需要将输入命名为其他内容。将Agreement
附加到您的类型名称是一个很好的惯例:
Input
这应该足以允许您传入type Mutation {
agreementsPost(agreement: AgreementInput): String
}
type Agreement {
id: Int
}
input AgreementInput {
id: Int
}
对象作为突变的参数。您无需向解析器添加AgreementInput
或Agreement
(实际上,GraphQL未对输入进行“解析”,因此无法为输入添加解析器。)
也就是说,你的解析器对象不需要包含AgreementInput
包提供的任何类型构造函数 - 当你调用时,Apollo会为你的解析器构造一个graphql
对象并为你定义类型定义GraphQLSchema
。
如果您的类型定义包含makeExecutableSchema
和Foo
类型,那么您的Bar
对象可能如下所示:
resolvers
注意const resolvers = {
Foo: {
someFooProperty: (foo, args, context, info) => {}
},
Bar: {
someBarProperty: (bar, args, context, info) => {}
someOtherBarProperty: (bar, args, context, info) => {}
},
Query: {
someQuery: (root, args, context, info) => {}
},
Mutation: {
someMutation: (root, args, context, info) => {}
},
}
对象中的每个属性如何匹配模式中定义的类型之一(包括查询和变异)。每个属性的值本身就是一个对象,每个属性映射到为该特定类型定义的字段之一。每个字段的值都是您的resolvers
函数。
您看到错误的原因是您已经有效地告诉resolve
将解析器添加到协议类型的两个字段 - makeExecutableSchema
和name
- 根据您的类型定义,它实际上在您的架构中。
您可以阅读有关如何使用Apollo here生成架构的更多信息。您可能会看到通过定义GraphQLSchema对象并将其传递到中间件而使用GraphQL.js“以编程方式”生成模式的示例。这两种方法都有利有弊,但使用fields
通常更容易,更不容易出错。无论哪种方式,知道如何以编程方式生成模式是件好事,但是你不应该将它们混合在一起!
答案 1 :(得分:1)
在我的情况下,发生这种情况是因为架构中的
答案 2 :(得分:1)
其他数据(与错误有关-与Q代码无关)。
我们在地图中定义了我们的解析器, 键对应与我们架构的类型。 https://www.apollographql.com/docs/tutorial/resolvers/
此“错误地图”错误的最基本的“ hello world” 示例。
我在目的上是错误的(在解析程序定义下-使用hello2
而不是hello
)。
graphql-yoga服务器示例:
/*index.js*/
const { GraphQLServer } = require('graphql-yoga')
const typeDefs = `
type Query {
hello(name: String): String!
}
`
const resolvers = {
Query: {
hello2: (_, { name }) => `Hello ${name || 'World'}`,
},
}
const server = new GraphQLServer({ typeDefs, resolvers })
server.start(() => console.log('Server is running on localhost:4000'))
抛出错误:
[错误:在解析程序中定义的Query.hello2,但在架构中未定义]
将解析器更改为hello
(与hello
模式类型匹配)以解决此错误:
相关:
答案 3 :(得分:0)
我从apollo-server-express的v1迁移到v2时遇到了此错误,该错误与未在架构中定义上载有关。现在,在声明graphql模式时,可以使用选项集uploads: false
// GraphQL: Schema
const SERVER = new ApolloServer({
typeDefs: typeDefs,
resolvers: resolvers,
introspection: true,
uploads: false,
playground: {
endpoint: `http://localhost:3000/graphql`,
settings: {
'editor.theme': 'light'
}
}
});
如果您的错误是Uploads
特定的,则在这种情况下似乎可以解决问题