Amplify和AppSync不更新来自多个来源的变异数据
我一直在尝试与 AppSync/GraphQL 进行交互:
- Lambda - 创建(有效)更新(不更改数据)
- Angular - 收到创建/更新订阅,但对象为空
- Angular - 欺骗更新(不改变数据)
- AppSync 控制台 - 欺骗更新(不更改数据)
邮政:
mutation MyMutation {
updateAsset(input: {
id: "b34d3aa3-fbc4-48b5-acba-xxxxxxxxxxx",
owner: "51b691a5-d088-4ac0-9f46-xxxxxxxxxxxx",
description: "AppSync"
}) {
id
owner
description
}
}
回复:
{
"data": {
"updateAsset": {
"id": "b34d3aa3-fbc4-48b5-acba-xxxxxxxxxx",
"owner": "51b691a5-d088-4ac0-9f46-xxxxxxxxxxx",
"description": "Edit Edit from AppSync"
}
}
每次我发送查询时,DynamoDB 中的版本都会自动递增。但描述仍与最初设定的相同。
架构上的身份验证规则 -
@auth(
rules: [
{ allow: public, provider: apiKey, operations: [create, update, read] },
{ allow: private, provider: userPools, operations: [read, create, update, delete] }
{ allow: groups, groups: ["admin"], operations: [read, create, update, delete] }
])
现在在前端,我在作弊,只是在收到空订阅事件后请求数据。但正如我所说,我似乎只能设置任何数据一次,然后我无法更新它。
任何见解表示赞赏。
更新:我什至决定尝试使用 DeleteAsset 语句,它不会删除而是修改版本。
我想也许接下来要做的明智的事情是要么建立一个新环境,要么尝试在一个新的帐户中支持它。
更新:我有一个工作理论,这与冲突检测/拒绝有关。当我尝试通过 AppSync 直接删除时,我被拒绝了。从 Angular 中,我只是在没有删除的情况下取回记录。
在 API 上添加额外的 Auth 后,我记得它询问了冲突解决方案,我选择了“AutoMerge”。文档在https://docs.aws.amazon.com/appsync/latest/devguide/conflict-detection-and-sync.html
回答
进一步审查后,我会记录发生的事情,希望对其他人有所帮助。
Createdamplify add api
这让我了解了一个向导。我使用了现有的 Cognito UserPool,因为我没有预见到我以后需要从 S3 触发器(Lambda 函数)调用这个 API。
现在需要授予apiKey
或最好从 Lambda 到 AppSync/GraphQL API 的 IAM 访问权限,我执行amplify update api
并添加了额外的身份验证设置。这问我想如何解决冲突,因为不止一个来源可以编辑数据。因为我只是在条款和条件上点击“同意”,很少阅读手册;我选择了“AutoMerge”……听起来不错吧?
所以现在,如果您阅读细则,对表所做的编辑将被拒绝,因为我们现在有这个 _version (Int) 需要通过,以便 AutoMerge 可以决定是否要接受您的更改。它还在 DynamoDB 跟踪版本中创建了一个额外的 DataStore 表。因此,为了妥善处理这一战略你需要扩展架构以包括_version
不只是id
或您选择使用任何主键。
另请注意:如果删除它会将_delete
Bool设置为 true。这实际上仍然返回到 UI,因此现在您的初始查询需要过滤掉(或不过滤)已删除的记录。
确定我也不需要这个。我不想使用数据存储(至少现在不是)所以:我在 API 中的 transform.conf.json 中找到了违规者。执行amplify update api
GraphQL 后,我选择了“为整个 API 禁用数据存储”,它摆脱了 ConflictHandler 和 ConflictDetection。
这也激起了我对 Create/Update 的 Angular 11 订阅,因为它创建的附加值破坏了预期的模型。更不用说由于没有任何变化而返回的偶数是空的。