Amplify DataStore执行codegen报Expected scalar and got User如何修复?
错误原因
该报错是因为你在@key、@connection指令的fields参数中传入了关联模型类型的字段名,而非当前模型下实际存在的标量类型字段:@key的fields只接受当前模型的标量字段作为索引依据,@connection的fields也只能填入当前模型中存储外键的标量字段,不能直接使用关联的User/Avatar这类自定义模型类型作为字段值。
代码生成成功是因为旧版本Amplify Codegen的静态校验容错机制,仅抛出错误提示但仍会兜底生成代码,但未修复的情况下后续运行时会出现关联数据查询、写入异常。
修复步骤
- 为所有存在关联的模型显式定义对应外键的标量字段,用于存储关联目标的索引值
- 修正所有
@key的fields参数,确保填入的值都是当前模型下的标量字段 - 修正所有
@connection的fields参数,填入当前模型下的外键标量字段,Amplify会自动匹配关联模型的对应索引
修复后完整schema代码
type User @model @key(name: "ByEmail", fields: ["email"], queryField: "userByEmail") @auth(rules: [{ allow: owner }]) { id: ID! email: String! gender: String! birthdate: String! faceImage: String avatarId: String # 新增:存储关联Avatar的avatarId值 favoriteAvatar: [Avatar] @connection(fields: ["avatarId"]) totalVideoTransform: Int registerAt: AWSDateTime! } type Avatar @model # 修正原拼写错误ByAvatrId为ByAvatarId @key(name: "ByAvatarId", fields: ["avatarId"], queryField: "avatarByAvatarId") @auth(rules: [{ allow: owner, ownerField: "favoriteUser", operations: [create, update, read] }]) { id: ID! avatarId: String! gender: String! userEmail: String # 新增:存储关联User的email值 favoriteUser: [User] @connection(fields: ["userEmail"]) totalVideoTransform: Int } type UserLoginLog @model # 修正fields为实际存在的外键标量字段 @key(name: "ByUser", fields: ["userEmail"], queryField: "userLoginLogByUser") @auth(rules: [{ allow: owner, operations: [create] }]) { id: ID! userEmail: String! # 新增:存储关联User的email值 user: User @connection(fields: ["userEmail"]) loginAt: AWSDateTime! } type VideoTransformLog @model # 修正fields为实际存在的外键标量字段 @key(name: "ByUser", fields: ["userEmail"], queryField: "videoTransformLogByUser") @auth(rules: [{ allow: owner, operations: [create] }]) { id: ID! userEmail: String! # 新增:存储关联User的email值 user: User @connection(fields: ["userEmail"]) logAvatarId: String! # 新增:存储关联Avatar的avatarId值 avatar: Avatar @connection(fields: ["logAvatarId"]) videoTransformAt: AWSDateTime! }
修改完成后重新执行amplify codegen models即可消除报错。
内容的提问来源于stack exchange,提问作者gs97ahn
相关产品推荐
相关产品推荐

