【问题标题】:Update Mutations in GraphQL with Appsync使用 Appsync 更新 GraphQL 中的突变
【发布时间】: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
  }
}

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

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

【问题讨论】:

    标签: graphql aws-amplify aws-appsync


    【解决方案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 中有多个列,而您只想更新一个列值怎么办。现在关闭更新单列值,我也传递所有其他列值。有没有什么方法可以更新给定的键值。
    猜你喜欢
    • 2022-10-31
    • 2021-04-24
    • 2018-11-21
    • 2020-05-02
    • 2019-08-21
    • 2020-11-23
    • 2020-08-13
    • 2021-06-23
    • 2018-11-05
    相关资源
    最近更新 更多