You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:12:34