Мутация 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, но он по-прежнему вызывает ошибку.
Спасибо, и актуальная проблема для вышеупомянутого резолвера, о котором я упоминал, $ util.dynamodb.toDynamoDBJson ($ ctx.args.ID), это должен быть $ util.dynamodb.toDynamoDBJson ($ ctx.args.input.ID).
да, если вы укажете другой параметр для идентификатора вашего updateStateMutation, тогда вам больше не нужен идентификатор в вашем вводе. так что вы можете использовать $ ctx.args.id
И я обычно использую ID! вместо String хе-хе
Это вызывает ошибку, потому что вы пытаетесь использовать 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, то эти значения будут изменены из исходной записи.
Я обновил последний ответ