AWS Amplify GraphQL创建条目报错:ID!非空类型被强制赋空值
AWS Amplify 创建GraphQL条目报
ID!非空错误解决方法 问题复现
原本稳定运行数月的创建类GraphQL请求,搁置应用一段时间后突然失效,抛出如下错误,不符合@model自动生成ID的预期逻辑:
Variable 'input' has coerced Null value for NonNull type 'ID!'
涉及的调用代码、GraphQL模型定义如下:
前端调用代码
const addArticle = async (event) => { const input = { ...article, data: JSON.stringify(article.data) }; return await API.graphql({ query: createArticle, variables: { input: input }, authMode: "AMAZON_COGNITO_USER_POOLS", }); };
GraphQL模型定义
type Article @model @key(name: "byTag", fields: ["tagId", "dateWritten"]) @key(name: "bySource", fields: ["sourceId", "dateWritten"]) { id: ID! link: AWSURL! title: String! dateWritten: String! articleDate: AWSDateTime data: AWSJSON! approved: Boolean! admin: Boolean! tagId: ID! creatorId: ID! creator: User @connection(fields: ["creatorId"]) sourceId: ID! source: Source @connection(fields: ["sourceId"]) }
根因分析
- Amplify
@model指令的自动生成ID逻辑,仅在创建请求的input参数完全不携带id字段时才会触发。只要入参里显式传了id: null,GraphQL入参校验层会直接拦截,根本走不到后端自动生成ID的逻辑,直接抛出非空校验错误。 - 之前代码能正常运行,是因为当时解构的
article状态对象里没有定义id属性。搁置期间大概率调整过表单初始值、状态初始化逻辑,或者某次接口返回的空数据把article对象里的id字段污染成了null,对象展开后就把id: null带进了请求入参。 - 小概率情况是搁置期间重新执行
amplify push时升级了GraphQL transformer版本,新版本对非空字段的入参校验更严格,之前隐式传undefined的场景现在会被识别为显式null触发校验。
修复方案
构造入参时显式过滤掉值为空的id字段,让后端可以正常触发自动生成ID的逻辑,修改后的代码如下:
const addArticle = async (event) => { const input = { ...article, data: JSON.stringify(article.data) }; // 移除空id,触发后端自动生成ID逻辑 if (!input.id) { delete input.id; } return await API.graphql({ query: createArticle, variables: { input: input }, authMode: "AMAZON_COGNITO_USER_POOLS", }); };
如果修改后仍报同类错误,逐一检查模型里其余标记为ID!的非空字段:tagId、creatorId、sourceId,这类字段如果传入null也会触发相同报错,把对应空值字段从入参里移除或者补全有效值即可。不需要降级Amplify版本,也不需要调整GraphQL schema定义,入参层面过滤空值就能彻底解决问题。
内容的提问来源于stack exchange,提问作者Joshua Foxworth
相关产品推荐
相关产品推荐

