Node.js调用AppSync遇GraphQL非空变量空值强制转换错误求助
排查GraphQL参数化查询的NonNull类型错误
这个错误的核心很明确:你传给mutation的input变量是null,但你的GraphQL schema里把CreateQuicktestInput定义成了非空类型(带!标记),GraphQL的类型系统严格禁止这种将null赋值给非空类型的操作。下面是一步步的排查和解决思路:
1. 先确认你的mutation调用代码里input变量的赋值
最常见的问题就是调用时input被意外设为null,或者没有正确传入。比如检查你的Node.js调用代码:
// 错误示例:input为null或者未正确赋值 const { data } = await client.mutate({ mutation: CREATE_QUICKTEST, variables: { input: null // 这里直接传null肯定触发错误 } });
你需要确保input是一个完全符合CreateQuicktestInput结构的对象,并且所有必填字段都有非空值。
2. 核对Schema里的CreateQuicktestInput定义
打开你的GraphQL schema文件,找到CreateQuicktestInput的定义,看看哪些字段是**强制非空(带!)**的。比如:
input CreateQuicktestInput { title: String! # 这个字段必须传非空字符串 count: Int! # 这个字段必须传非空数字 description: String # 这个字段可选,可以不传或者传null }
如果你的input对象里缺了title或者count,或者这两个字段的值是null,都会导致整个input被视为不符合非空类型要求,触发错误。
3. 检查你的mutation语句定义
确认你的mutations文件里的mutation声明是否正确绑定了变量类型:
# 正确的mutation定义示例 mutation CreateQuicktest($input: CreateQuicktestInput!) { createQuicktest(input: $input) { id title } }
这里$input的类型明确是CreateQuicktestInput!,所以调用时必须传入一个非空的input对象,不能省略。
4. 调试变量值,排查数据来源问题
因为你提到是从REST数据源获取数据填充,很可能是REST返回的数据有缺失,导致组装input时出现null。在调用mutation之前,先打印input变量看看:
const inputData = { title: restData.title, count: restData.count }; console.log("准备传入的input:", inputData); // 检查这个对象有没有null或者缺失的必填字段 if (!inputData.title || inputData.count === null) { throw new Error("REST数据缺失必填字段,无法组装CreateQuicktestInput"); } // 再执行mutation const { data } = await client.mutate({ mutation: CREATE_QUICKTEST, variables: { input: inputData } });
正确调用示例
假设你的schema要求title和count为必填非空字段,正确的调用代码应该是这样的:
// 从REST接口获取数据并校验 const restResponse = await fetch('your-rest-api-url'); const restData = await restResponse.json(); // 组装符合要求的input对象,给必填字段加兜底避免null const inputData = { title: restData.itemTitle || "默认标题", count: restData.itemCount !== undefined ? restData.itemCount : 0 }; try { const { data } = await client.mutate({ mutation: CREATE_QUICKTEST, variables: { input: inputData } }); console.log("成功创建记录:", data.createQuicktest); } catch (error) { console.error("mutation失败:", error); }
内容的提问来源于stack exchange,提问作者Iain Cox
相关产品推荐
相关产品推荐

