【问题标题】:Why does AppSync throwing error on Update?为什么 AppSync 在更新时抛出错误?
【发布时间】:2019-02-16 14:32:57
【问题描述】:

AWS AppSync 突变在尝试执行更新操作时引发错误。我已经正确创建了表格和我的

下面是 GraphQL Schema

type Mutation {
  updateStateMutation(input: UpdateData!): ReturnValue
}

input UpdateData {
  ID: String
  OPP: Int
  loc: [Float]
  CDC: String
  MND: String
  CSP: Int
}

type ReturnValue {
  ID: String
  CDC: String
  MND: String
  loc: [Float]
  CSP: Int
  OPP: Int
}

Bellow 是突变的解析器

{
    "version" : "2017-02-28",
    "operation" : "PutItem",
    "key" : {
        "ID":  $util.dynamodb.toDynamoDBJson($ctx.args.ID),
    },
    "attributeValues" : $util.dynamodb.toMapValuesJson($ctx.args)
}

Bellow 是我在 GraphQL 上执行的执行部分

mutation UpdateStateData {
  updateStateMutation(input: { 
    ID: "100000000-ofo"
    CDC: "3E5E65117E877076L"
    MND: "6EA8F0DAE8C3D09F"
    CSP: 2
  }){
    ID
    CDC
    MND
    CSP
    loc
    OPP
  }
}

执行时出现如下错误。

{
  "data": {
    "updateStateMutation": null
  },
  "errors": [
    {
      ………
      "message": "One or more parameter values were invalid: Type mismatch for key ID expected: S actual: NULL (Service: AmazonDynamoDBv2; Status Code: 400; Error Code: ValidationException; Request ID: MRMBUAFKERB48R7JTH5TUV8I8NVV4KQNSO5AEMVJF66Q9ASUAAJG)"
    }
  ]
}

上面的编码有什么问题。我已正确输入,但我仍然面临错误。 DynamoDB 中的键名是 ID,但它仍然抛出错误。

【问题讨论】:

  • 我已经更新了最新答案
  • 谢谢,上面的实际问题在我提到的解析器中 $util.dynamodb.toDynamoDBJson($ctx.args.ID) 它应该是 $util.dynamodb.toDynamoDBJson($ctx.args .input.ID)。
  • 是的,如果您为您的 updateStateMutation 的 id 放置另一个参数,那么您不再需要输入中的 id。所以你可以使用 $ctx.args.id
  • 而且我通常使用ID!而不是字符串呵呵

标签: graphql aws-appsync


【解决方案1】:

它会抛出错误,因为您尝试使用 PutItem 而不是 UpdateItem 操作并且忘记将 id 作为参数。您可能需要从您的 UpdateData 输入中删除 ID 并将您的突变更改为以下内容:

type Mutation {
  updateStateMutation(id: String!, input: UpdateData!): ReturnValue
}

您的解析器映射如下所示:

#set( $expression = "SET" )
#set( $expValues = {} )

#if( !$util.isNull(${context.arguments.input.OPP}) ) 
    #set( $expression = "${expression} OPP = :OPP" )
  $!{expValues.put(":OPP",  { "N" : ${context.arguments.input.OPP} })}
#end

#if( !$util.isNull(${context.arguments.input.loc}) ) 
    #if( ${expression} != "SET" ) 
        #set( $expression = "${expression}," )
    #end
    #set( $expression = "${expression} loc = :loc" )
  $!{expValues.put(":loc", $util.dynamodb.toDynamoDBJson($context.arguments.input.loc) )}
#end

#if( !$util.isNull(${context.arguments.input.CDC}) ) 
    #if( ${expression} != "SET" ) 
        #set( $expression = "${expression}," )
    #end
    #set( $expression = "${expression} CDC = :CDC" )
  $!{expValues.put(":CDC",  { "S" : ${context.arguments.input.CDC} })}
#end

#if( !$util.isNull(${context.arguments.input.MND}) ) 
    #if( ${expression} != "SET" ) 
        #set( $expression = "${expression}," )
    #end
    #set( $expression = "${expression} MND = :MND" )
  $!{expValues.put(":MND",  { "S" : ${context.arguments.input.MND} })}
#end

#if( !$util.isNull(${context.arguments.input.CSP}) ) 
    #if( ${expression} != "SET" ) 
        #set( $expression = "${expression}," )
    #end
    #set( $expression = "${expression} CSP = :CSP" )
  $!{expValues.put(":CSP",  { "N" : ${context.arguments.input.CSP} })}
#end

{
    "version" : "2017-02-28",
    "operation" : "UpdateItem",
    "key" : {
        "ID" : { "S" : "${context.arguments.id}" }
    },
    "update" : {
        "expression" : "${expression}",
        "expressionValues": $util.toJson($expValues)
    }
}

希望有用! :)

【讨论】:

  • 你是对的。 PutItem 也可以更新现有记录,但最合适的是 UpdateItem。我们可以使用 UpdatedItem 指定现有记录的哪些文件需要更新。如果我们未能在 PutItem 中指定现有属性,那么这些值将从原始记录中恢复。
猜你喜欢
  • 2021-09-25
  • 2017-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-28
  • 1970-01-01
  • 2022-12-31
相关资源
最近更新 更多