GraphQL定义含对象参数的Mutation时Resolver与Schema不匹配报错求助
解决GraphQL报错:Agreement.name defined in resolvers, but not in schema
这个报错的核心原因很明确:你同时通过两种方式定义了Agreement类型——一边用SDL(就是你写的typeDefs字符串)声明了它,另一边又在Resolver里手动创建了GraphQLObjectType实例来定义它,这就导致GraphQL无法将两者对应起来,认为Resolver里的Agreement是一个在Schema里不存在的类型。
怎么修复?
你完全不需要在Resolver里手动定义Agreement类型,SDL已经帮你完成了类型结构的声明。Resolver的职责是为Schema里的字段提供解析逻辑,而不是重复定义类型本身。
修正后的代码示例:
首先你的typeDefs可以保持不变:
const typeDefs = ` type Agreement { id: Int } type Mutation { agreementsPost(agreement: Agreement) : String } `;
然后调整Resolver,移除手动定义的Agreement类型,只保留Mutation的解析函数:
const appResolvers = { Mutation: { agreementsPost: (parent, { agreement }) => { // 在这里处理你的业务逻辑,比如将agreement数据存入数据库 console.log("收到的协议数据:", agreement); return "协议提交成功"; } } // 只有当Agreement的字段需要自定义解析逻辑时,才需要在这里声明Agreement的Resolver // 比如如果id字段需要从其他数据源获取,而不是直接取父对象的id: // Agreement: { // id: (parent) => { // // 自定义解析逻辑,比如从数据库查询真实的id // return parent.id; // } // } };
为什么这样能解决问题?
当你使用SDL定义Schema时,GraphQL会自动根据SDL生成对应的类型元数据。Resolver的结构只需要和SDL里的类型、字段一一对应即可:比如SDL里有Mutation类型和它的agreementsPost字段,你就在Resolver里写Mutation对象,里面放agreementsPost的解析函数。
手动创建GraphQLObjectType的Agreement属于用代码优先的方式定义类型,和SDL优先的方式冲突了,所以才会抛出这个匹配错误。
内容的提问来源于stack exchange,提问作者Mohamed Taboubi
相关产品推荐
相关产品推荐

