Почему AppSync выдает ошибку при обновлении?

Мутация 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)
}

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, но он по-прежнему вызывает ошибку.

Я обновил последний ответ

KoingDev 12.09.2018 14:23

Спасибо, и актуальная проблема для вышеупомянутого резолвера, о котором я упоминал, $ util.dynamodb.toDynamoDBJson ($ ctx.args.ID), это должен быть $ util.dynamodb.toDynamoDBJson ($ ctx.args.input.ID).

Desmond 12.09.2018 14:26

да, если вы укажете другой параметр для идентификатора вашего updateStateMutation, тогда вам больше не нужен идентификатор в вашем вводе. так что вы можете использовать $ ctx.args.id

KoingDev 12.09.2018 14:28

И я обычно использую ID! вместо String хе-хе

KoingDev 12.09.2018 14:30
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Что такое Apollo Client и зачем он нужен?
Что такое Apollo Client и зачем он нужен?
Apollo Client - это полнофункциональный клиент GraphQL для JavaScript-приложений, который упрощает получение, управление и обновление данных в...
0
4
864
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это вызывает ошибку, потому что вы пытаетесь использовать 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)
    }
}

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

Ты прав. PutItem также может обновлять существующую запись, но наиболее подходящим является UpdateItem. Мы можем указать, какие поля существующих записей необходимо обновить, используя UpdatedItem. Если нам не удалось указать существующие атрибуты в PutItem, то эти значения будут изменены из исходной записи.

Desmond 12.09.2018 14:24

Другие вопросы по теме