AWS AppSync中GraphQL SDL的@isUnique失效及随机ID生成问题
解决AWS AppSync Schema解析错误与自动生成ID的问题
一、先搞定Schema解析错误
从你贴的SDL代码来看,解析失败主要有几个明确的原因,逐个修正就能解决:
错误使用
@isUnique指令
AWS AppSync原生SDL并不支持@isUnique这个指令——它是AWS Amplify GraphQL Transform库提供的扩展指令。- 如果你用Amplify开发,记得给类型加上
@model指令,而且id作为主键本身就是唯一的,没必要再加@isUnique;如果是其他字段需要唯一性,直接在字段上标注@isUnique即可,Amplify会自动帮你创建对应的唯一索引。 - 要是你直接在AppSync控制台手动配置Schema,就得通过DynamoDB的全局二级索引(GSI)来实现字段唯一性,原生SDL不认识
@isUnique,这是导致解析报错的核心原因之一。
- 如果你用Amplify开发,记得给类型加上
未定义关联的
Messages类型
你在Person里引用了[Messages!]!,但整个Schema里没定义Messages类型,这肯定会触发解析错误。得补上这个类型的定义,比如:
type Messages { id: ID! content: String! person: Person! @relation(name: "UserMessages") }
- 拼写小错误:
updateAt→updatedAt
虽然这不会直接导致解析失败,但这是AppSync/Amplify自动时间戳字段的标准命名,建议修正成updatedAt: String!,方便后续启用自动生成时间戳的功能。
如果用Amplify的话,修正后的完整基础Schema应该是这样:
type Person @model { id: ID! createdAt: String! updatedAt: String! name: String! messages: [Messages!]! @relation(name: "UserMessages") } type Messages @model { id: ID! content: String! person: Person! @relation(name: "UserMessages") }
要是不用Amplify,去掉@model指令,自己手动配置数据源和 resolver 就行。
二、自动生成随机ID的两种方案
根据你的开发场景,推荐两种实用的实现方式:
方案1:用Amplify的@model指令(最省心)
如果用AWS Amplify开发,只要给类型加上@model指令,Amplify会自动帮你完成:
- 为
id字段生成UUID格式的随机唯一ID; - 自动维护
createdAt和updatedAt的时间戳值。
前面修正后的Schema已经包含了这个配置,部署后Amplify会自动创建对应的DynamoDB表和 resolver。
方案2:手动配置AppSync Resolver(适合自定义场景)
要是你手动配置AppSync(不用Amplify),可以在创建数据的resolver请求模板里,用AppSync内置的工具函数util.autoId()生成随机ID:
{ "version": "2017-02-28", "operation": "PutItem", "key": { "id": { "S": "${util.autoId()}" } }, "attributeValues": { "name": { "S": "${ctx.args.name}" }, "createdAt": { "S": "${util.time.nowISO8601()}" }, "updatedAt": { "S": "${util.time.nowISO8601()}" } // 其他需要传入的字段... } }
这样每次创建Person记录时,AppSync都会自动生成一个随机UUID作为id值。
另外,你也可以在DynamoDB表配置里,把id设为主键并启用自动生成UUID,但用util.autoId()的方式在 resolver 里控制会更灵活。
内容的提问来源于stack exchange,提问作者Bharath Kuppala
相关产品推荐
相关产品推荐

