求助:我的GraphQL查询为何未调用解析器?
排查GraphQL解析器未被调用的实用方向
我之前也踩过一模一样的坑,卡了大半天没头绪,太懂这种明明步骤全对却没反应的挫败感了!结合你说的「之前模拟数据正常,现在换真实解析器没调用」的情况,给你几个针对性的排查点:
1. 先查「模拟数据的残留覆盖」
你提到注释了mocks导入,但有没有把addMockFunctionsToSchema的调用也完全删掉/注释掉?
这个函数的坑在于:哪怕你不传mocks参数,它也会自动生成默认的模拟解析器,直接覆盖你自定义的真实解析器!
比如如果你的代码里还留着:
const schema = makeExecutableSchema({ typeDefs, resolvers }); // 哪怕下面这行没传mocks,也会搞事情! addMockFunctionsToSchema({ schema });
那你的真实解析器肯定不会被触发,赶紧把这行彻底注释掉试试!
2. 验证makeExecutableSchema的配置正确性
确保你在构建schema时,正确传入了resolvers参数,而且结构完全匹配类型定义:
- 比如你的
typeDefs里定义了type Query { getPosts: [Post] },那resolvers必须是:
const resolvers = { Query: { getPosts: () => { console.log("解析器被调用了!"); // 先加个日志确认 // 你的真实逻辑 } } }; // 构建schema时必须传resolvers const schema = makeExecutableSchema({ typeDefs, resolvers });
别漏传resolvers,也别写错层级(比如把getPosts直接放在resolvers根目录,而不是Query下面)。
3. 检查字段名称的严格匹配
GraphQL对字段名称的大小写、下划线是严格区分的:
- 如果typeDef里是
post_title: String,解析器里不能写成postTitle - 如果是嵌套类型(比如
Post.author),解析器要写在对应类型下面,而不是Query里:
const resolvers = { Post: { author: (parent) => { // parent是当前Post对象,这里处理关联查询 } } };
4. 快速调试小技巧
- 在解析器函数第一行加
console.log("触发了!"),同时在启动服务器时打开控制台,看有没有输出 - 用GraphQL Playground的「Introspection查询」,查看对应的字段是否关联了自定义解析器(如果显示的是默认模拟解析器,说明你的resolvers没挂载上)
内容的提问来源于stack exchange,提问作者redOctober13
相关产品推荐
相关产品推荐

