Amplify 和 AppSync 不更新来自多个来源的突变数据

Posted

技术标签:

【中文标题】Amplify 和 AppSync 不更新来自多个来源的突变数据【英文标题】:Amplify and AppSync not updating data on mutation from multiple sources 【发布时间】:2021-04-15 23:20:12 【问题描述】:

我一直在尝试通过以下方式与 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 上添加额外的身份验证后,我记得它询问了冲突解决,我选择了“AutoMerge”。在https://docs.aws.amazon.com/appsync/latest/devguide/conflict-detection-and-sync.html

【问题讨论】:

【参考方案1】:

这里有很好的信息,马克。感谢您的撰写和更新。

我正在玩这个,通过自动合并冲突解决策略,我能够通过发送一个最新的 _version 成员来使用 GraphQL 突变发布更新。

这个函数:

await API.graphql(
     graphqlOperation(updateAsset,  
          input:  
              id: assetToUpdate.id, 
              name: "Updated name", 
              _version: assetToUpdate._version 
          
    
));

正确更新、联系 AppSync 并将更改传播到 DynamoDB/DataStore。使用相同的版本告诉 AppSync 我们是最新的并且能够编辑内容。然后 AppSync 管理/增加 _version/_createdAt/etc。

【讨论】:

您敢打赌,有时您会感觉自己置身于孤岛上。感谢每一个走类似旅程的人。我在 Amplify 上玩得很开心。刚刚将我的主要处理 lambda 之一切换到 arm64。比 x86_64 更快地完成任务。【参考方案2】:

在进一步审查后,我会记录发生的事情,希望对其他人有所帮助。

创建amplify add api 这让我通过了一个巫师。我使用了现有的 Cognito UserPool,因为我没有预见到以后需要从 S3 触发器(Lambda 函数)调用此 API。

现在需要授予 apiKey 或者最好是 IAM 从 Lambda 到 AppSync/GraphQL API 的访问权限,我执行了 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 订阅,因为它创建的附加值破坏了预期的模型。更不用说由于没有任何变化而导致的偶数返回。

【讨论】:

你拯救了我的一天。非常感谢! 这也为我解决了问题。我只是没有在 UpdateInput 中传递 _version。

以上是关于Amplify 和 AppSync 不更新来自多个来源的突变数据的主要内容,如果未能解决你的问题,请参考以下文章

Graphql - 无权访问来自 AWS AppSync Amplify 控制台的错误消息

Amplify + AppSync 不改变对象

如何使用 amplify 将 GraphQL 更改从 Appsync 同步到 Android?

Amplify AppSync:使用分页进行自定义排序和过滤

在 Cogntio/AWS Amplify 中支持多个用户池或组织?

AppSync/Amplify - 如何定义 GraphQL 订阅