如何在GraphQL中实现不同resolver字段间的访问?
在GraphQL Resolver中访问其他Resolver字段的简单方法
当然可以!你现在的问题其实是因为resolvers的结构没搞对,根本不需要复杂的变通方案——GraphQL本身的执行机制就支持这种场景。
先看你现有代码的问题:你把Person类型的字段resolvers放到了Query下面,这是错误的。Query里的resolver是处理根查询字段的(比如获取Person列表或单个Person的查询),而Person类型自身的字段(full、greet)应该作为顶级属性直接挂在resolvers对象上。
修正后的正确代码示例
const resolvers = { // 根查询的resolver:如果有获取Person的查询,比如getPerson,写在这里 Query: { getPerson: () => ({ first: "John", last: "Doe" }) }, // 这里才是Person类型的字段resolvers Person: { full: ({ first, last }) => `${first} ${last}`, greet: (parent) => `Hello, my name is ${parent.full}` } };
为什么这样能行?
GraphQL的 resolver 执行是有顺序的:
- 先执行根查询的resolver(比如
Query.getPerson),返回一个包含first和last的对象作为父对象(parent参数)。 - 接着执行
Person.full的resolver,把父对象传进去,计算出full的值后,这个值会被添加到父对象中。 - 最后执行
Person.greet的resolver时,parent参数就已经包含了刚解析好的full字段值,直接用就行。
举个查询的例子,如果你的查询是:
query { getPerson { full greet } }
返回结果会是:
{ "data": { "getPerson": { "full": "John Doe", "greet": "Hello, my name is John Doe" } } }
注意事项
如果你的查询里没有请求full字段,那parent.full就会是undefined,这时候greet的resolver会出问题。如果想避免这种情况,有两个简单办法:
- 直接在
greet的resolver里自己计算全名,不依赖parent.full:greet: ({ first, last }) => `Hello, my name is ${first} ${last}` - 确保
full字段总是被解析,哪怕查询没请求它——不过这种情况很少见,一般还是推荐第一种办法,更直接。
总结一下:只要把类型的字段resolvers放在正确的位置(顶级的类型属性下),GraphQL会自动帮你处理字段的解析顺序,让你轻松访问其他已经解析好的字段值,完全不需要复杂的变通方案。
内容的提问来源于stack exchange,提问作者Alex Cory
相关产品推荐
相关产品推荐

