使用graphql-tools时子解析器参数不符合规范的问题咨询
问题分析与解决:GraphQL子解析器参数顺序错误,obj参数缺失
你碰到的这个问题是因为错误地把子字段解析器定义成了父字段返回对象的方法,完全不符合GraphQL解析器的规范写法。
先还原下你的场景:
你使用的查询语句是:
{ parentWithArg(a: "test") { childWithArg(b: "test") } }
解析器代码写成了这样:
const resolvers = { Query: { parentWithArg(obj, args, ctx) { console.log('parentWithArg obj:', obj); // 这里输出`{}`,符合预期 return { childWithArg(obj, args, ctx) { console.log('childWithArg obj:', obj); // 这里居然输出`{ b: 'test' }` return args.b; // 结果返回null } }; }, }, };
为什么会出问题?
GraphQL的解析器是按Schema中的类型层级来组织的,不是把子解析器嵌套在父字段返回的对象里。你现在的写法中,childWithArg是父字段返回对象的一个方法,当GraphQL解析这个字段时,它会把这个方法当作普通函数调用——这时候函数的第一个参数就变成了该字段的args,而不是父字段返回的obj,自然就出现了你看到的参数错位问题。
正确的写法
你需要把解析器按类型拆分,单独定义子字段所在类型的解析器:
const resolvers = { Query: { parentWithArg(obj, args, ctx) { console.log('parentWithArg obj:', obj); // 输出`{}`,正常 // 父字段只需要返回对应类型的业务数据,不需要包含解析器 return { parentValue: args.a }; }, }, // 假设你的parentWithArg字段返回的类型叫ParentType(要和你的Schema定义严格对应) ParentType: { childWithArg(obj, args, ctx) { console.log('childWithArg obj:', obj); // 现在会输出父字段返回的{ parentValue: 'test' } console.log('childWithArg args:', args); // 输出{ b: 'test' } return args.b; // 正常返回'test' } } };
关键要点
- 解析器的结构要和Schema的类型定义对应,每个类型下定义它的字段解析器
- 父字段只负责返回该类型的业务数据,不要把子字段的解析逻辑写在返回对象里
- 子字段的解析器会自动接收三个参数:父字段返回的
obj、当前字段的args、上下文ctx,顺序不能搞混
这样调整后,你的子解析器就能正常拿到父对象的参数了。
内容的提问来源于stack exchange,提问作者robC
相关产品推荐
相关产品推荐

