使用AWS AppSync创建用户时遇GraphQL非空ID变量空值错误
解决AWS AppSync Mutation报错:GraphQL error: Variable 'id' has coerced Null value for NonNull type 'ID!'
这个错误其实很好理解——你定义的addUser mutation要求id是必填的非空ID类型(也就是ID!),但你在调用这个mutation的时候,要么压根没传id变量,要么传的id值是null,直接触发了GraphQL的类型校验规则。
下面分两种最常见的场景给你解决方案:
场景1:你需要手动指定用户ID
如果你的业务逻辑要求自己生成并传入ID(比如用自定义规则或者UUID),那只要确保调用mutation时给id传一个有效的非空值就行:
检查调用代码的变量传递
比如在前端调用mutation的时候,要确保variables里的id有值,不能是null或者undefined:// 举个React里调用的例子 import { useMutation } from '@apollo/client'; import addUserMutation from './your-mutation-file'; const AddUser = () => { const [addUser] = useMutation(addUserMutation); const handleAddUser = () => { addUser({ variables: { id: 'user-20240520-001', // 这里必须是非空字符串,比如用uuid生成 name: 'Rizwan', email: 'rizwan@example.com', // 其他必填参数别忘了传 } }); }; return <button onClick={handleAddUser}>添加用户</button>; };用工具生成可靠的ID
如果需要自动生成ID,推荐用uuid库生成标准UUID,避免手动写出现空值的情况:import { v4 as uuidv4 } from 'uuid'; const userId = uuidv4(); // 生成类似 "1b9d6bcd-bbfd-4b2d-9b5d-ab8dfbbd4bed" 的非空ID
场景2:希望AppSync自动生成ID(更推荐)
如果你的用户存在DynamoDB里,通常更省心的方式是让AppSync自动生成主键ID,这时候需要调整你的mutation定义和Resolver配置:
修改前端的Mutation标签
把addUser里的$id参数和对应的输入字段删掉,因为不需要前端传了:import gql from 'graphql-tag'; export default gql` mutation addUser ( $name:String!, $email:String!, $number:String!, $gender:String!, $password:String!, $createdAt:String!, $type:String! ){ addUser( name:$name, email:$email, number:$number, gender:$gender, password:$password, createdAt:$createdAt, type:$type ) { id // 这里仍然可以返回自动生成的ID name email } } `;配置AppSync的Resolver自动生成ID
进入AWS AppSync控制台,找到你的addUsermutation对应的Resolver,修改请求映射模板,用AppSync内置的工具自动生成ID:{ "version": "2017-02-28", "operation": "PutItem", "key": { "id": { "S": "$util.autoId()" } // 这行自动生成UUID作为主键 }, "attributeValues": { "name": { "S": "$ctx.args.name" }, "email": { "S": "$ctx.args.email" }, "number": { "S": "$ctx.args.number" }, "gender": { "S": "$ctx.args.gender" }, "password": { "S": "$ctx.args.password" }, "createdAt": { "S": "$ctx.args.createdAt" }, "type": { "S": "$ctx.args.type" } } }这样调用mutation时,不用传
id,AppSync会自动生成并写入DynamoDB,还能在返回结果里把这个ID给你返回回来。
额外要检查的点
- 如果你用了自定义的Input Type(比如
AddUserInput),也要确保这个Input Type里的id不是ID!,要么改成可选(ID),要么直接删掉。 - 核对AppSync控制台里的Schema和你前端的mutation定义,确保前后端的参数要求一致,避免出现前端传了后端没要,或者后端要了前端没传的情况。
内容的提问来源于stack exchange,提问作者Rizwan
相关产品推荐
相关产品推荐

