向GraphQL查询传入ID变量无法返回数据的问题排查
问题排查与解决
你的问题出在两个关键细节上:
1. 解析器参数获取错误
GraphQL解析器函数的参数顺序是 (parent, args, context, info),你直接把第一个参数当作传入的id,但实际上第一个参数是父对象(此处Query的父对象为空),查询定义的参数都封装在第二个参数args里。
2. 返回值类型不匹配
你用filter方法返回的是数组,但你的Query定义single_research(id: ID!): Research!要求返回单个Research对象。数组本身没有title、id等字段,导致GraphQL解析时无法读取非空的title字段,进而抛出Cannot return null for non-nullable field Research.title错误。
修正后的解析器代码
const resolvers = { Query: { single_research: (_, args) => { // 用find获取单个匹配对象,替代filter返回的数组 const researchItem = research.find(item => item.id === args.id); // 处理未找到匹配项的情况,避免返回null违反非空约束 if (!researchItem) { throw new Error(`Research with ID ${args.id} does not exist`); } return researchItem; } }, };
关键说明
- 用
_占位第一个参数(不需要父对象时的惯例写法),通过args.id正确获取传入的查询参数 - 替换
filter为find,返回单个匹配的对象,完全符合Schema定义的返回类型 - 增加未找到时的错误抛出逻辑,避免返回null触发新的非空字段错误
内容的提问来源于stack exchange,提问作者Jon Nicholson
相关产品推荐
相关产品推荐

