Почему AppSync выдает ошибку при обновлении? - PullRequest
0 голосов
/ 12 сентября 2018

Мутация AWS AppSync вызывает ошибку при попытке выполнить операцию обновления. Я правильно создал таблицу и мой

Ниже приведена схема GraphQL

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
}

Сильфон является резольвером для мутации

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

Сильфон - это исполняющая часть, которую я исполняю на 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, но оно все еще выдает ошибку.

1 Ответ

0 голосов
/ 12 сентября 2018

Выдает ошибку, потому что вы пытаетесь использовать PutItem вместо UpdateItem операции и забыли поставить id в качестве аргумента. Возможно, вам придется удалить ID из вашего UpdateData ввода и изменить мутацию на что-то вроде этого:

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)
    }
}

Надеюсь, это полезно! :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...