使用express-graphql时GraphQL查询无法触发Resolver的问题
问题分析与解决
核心问题1:Resolver参数签名错误
你的createTask resolver参数写法错误,导致无法正确获取传入的task参数:
// 错误写法 createTask: async ({ task }) => { ... } // 正确写法 createTask: async (_, { task }) => { ... }
express-graphql中Resolver函数的参数顺序为:root(父级对象)、args(查询参数)、context、info。你把第一个参数root当成了参数对象,导致task始终为undefined,后续代码执行出错后返回null,触发Cannot return null for non-nullable field Mutation.createTask错误,同时你写的console.log('Request received in resolver')也不会执行。
核心问题2:updateTask返回值不符合Schema定义
Schema中updateTask定义返回Task!类型,但Resolver返回的是包含status、message、task的复合对象,和Schema定义的结构完全不匹配:
// 错误返回 return { status: result.status, message: result.message, task: result.task, }; // 正确返回(直接返回Task对象) return result.task;
这种结构不匹配会导致GraphQL无法解析出符合要求的返回值,同样会触发非空字段错误。
额外检查点
- 确认
TaskService.addTask方法返回的对象包含id、title、description、tags、done所有Schema定义的字段,缺少任何非空字段都会导致返回错误。 - 检查Postman请求配置:确保请求方法为
POST,Content-Type设置为application/json,请求体正确携带GraphQL查询内容。
修改后的createTask和updateTask resolver示例:
Mutation: { createTask: async (_, { task }) => { console.log('Request received in resolver'); try { const { title, description, tags } = task; const result = await taskService.addTask(title, description, tags); console.log(result); // 确保result包含Task的所有字段 return result; } catch (err) { console.error('Error while creating task: ', err); throw new Error(err.message || 'Internal server error'); } }, updateTask: async (_, { id, task }) => { console.log('Request received in resolver'); try { const { title, description, tags, done } = task; const result = await taskService.updateTask( id, title, description, tags, done ); // 返回符合Task类型的对象 return result.task; } catch (err) { console.error('Error while updating task: ', err); throw new Error(err.message || 'Internal server error'); } }, }
内容的提问来源于stack exchange,提问作者Анна Некрасова
相关产品推荐
相关产品推荐

