这里有几件事要解决。首先,要将对象用作参数,您必须在架构中将其定义为input(或GraphQLInputObjectType)——您不能使用常规的type(或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 或 AgreementInput 添加到解析器(事实上,GraphQL 不会“解析”输入,因此无法为输入添加解析器)。
也就是说,您的解析器对象不需要包含graphql 包提供的任何类型构造函数——当您调用makeExecutableSchema 时,Apollo 从您的解析器和类型定义中构造一个GraphQLSchema 对象。
如果您的类型定义包括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 和 fields - 这两个字段实际上都不在您的根据您的类型定义的架构。
您可以阅读有关如何使用 Apollo here 生成架构的更多信息。您可能会看到仅使用 GraphQL.js 通过定义 GraphQLSchema 对象并将其传递给中间件来“以编程方式”生成模式的示例。这两种方法各有利弊,但使用makeExecutableSchema 通常更容易且不易出错。无论哪种方式,了解如何以编程方式生成模式都很好,但您不应该将两者混为一谈!