使用 Appsync 更新 GraphQL 中的突变

Posted

技术标签:

【中文标题】使用 Appsync 更新 GraphQL 中的突变【英文标题】:Update Mutations in GraphQL with Appsync 【发布时间】:2020-05-30 14:10:53 【问题描述】:

我在使用 react-native 和 amplify 更新突变时遇到问题。

addProfileDetails = async (sub) => 
    let UserDetails = await API.graphql(graphqlOperation(mutations.updatePeople, updatePeopleInput: 
         
            UserID: sub,
            Organization: "Organization"
            Name: "name"
        
    ));
    console.log(UserDetails);
  ;

此代码不会产生任何错误,它与我最初用于创建记录的代码几乎相同。

但它会返回此数据并且实际上并未按预期更新记录。

Object 
  "data": Object 
    "updatePeople": null,
  ,

我在 appsync 查询编辑器上测试了这个查询:

mutation update 
  updatePeople (updatePeopleInput: 
    PersonID: "XXXXXXXXXXXXXXXXXXXXXXXXXX",
    Gender: "Male"
  )
    
    PersonID
    Gender
  

它返回相同的。创建突变工作,查询工作。我不明白这里发生了什么。

任何关于我做错了什么的见解都会有所帮助。另外,如果您需要架构或突变代码,我可以提供。

【问题讨论】:

【参考方案1】:

我想通了。

原来 Appsync 创建的默认解析器无法更新我的 RDS 的突变。

我通过更改请求解析器解决了这个问题:

#set( $updateList =  )
#foreach( $entry in $ctx.args.updatePeopleInput.keySet() )
  #set( $discard = $updateList.put($entry, "'$ctx.args.updatePeopleInput[$entry]'") )
#end
#set( $update = $updateList.toString().replace("","").replace("","") )

  "version": "2018-05-29",
  "statements":   [
    $util.toJson("UPDATE People SET Gender='$ctx.args.updatePeopleInput.Gender', Username='$ctx.args.updatePeopleInput.Username' WHERE PersonID='$ctx.args.updatePeopleInput.PersonID'"),
    $util.toJson("SELECT * FROM People WHERE PersonID='$ctx.args.updatePeopleInput.PersonID'")
    ]

之前是这样的:

#set( $updateList =  )
#foreach( $entry in $ctx.args.updatePeopleInput.keySet() )
  #set( $discard = $updateList.put($entry, "'$ctx.args.updatePeopleInput[$entry]'") )
#end
#set( $update = $updateList.toString().replace("","").replace("","") )

  "version": "2018-05-29",
  "statements":   [
    $util.toJson("UPDATE People SET $update WHERE PersonID='$ctx.args.updatePeopleInput.PersonID'"),
    $util.toJson("SELECT * FROM People WHERE PersonID='$ctx.args.updatePeopleInput.PersonID'")
    ]

显然 $update 不起作用,您必须明确命名要设置的变量。

【讨论】:

那么,如果 db 中有多个列,而您只想更新一个列值怎么办。现在关闭更新单列值,我也传递所有其他列值。有没有什么方法可以更新给定的键值。

以上是关于使用 Appsync 更新 GraphQL 中的突变的主要内容,如果未能解决你的问题,请参考以下文章

从 Lambda 调用 AWS AppSync graphql API

如何使用 AWS appsync (GraphQL) 禁用自省查询?

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

使用 AWS Appsync 和 GraphQL 查询 Dynamo DB 中的多个表

aws amplify appsync 中的 Graphql 突变错误

在 Ionic AWS Starter 模板中使用 Appsync 中的 Graphql 和 AWS Amplify 未捕获的异常 [Object Object]