为什么 AppSync 在更新时抛出错误?
Why does AppSync throwing error on Update?
AWS AppSync 突变在尝试执行更新操作时抛出错误。我已经正确创建了 table 和我的
下面是 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
}
Bellow 是突变的解析器
{
"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,但它仍然会抛出错误。
它会抛出错误,因为您试图使用 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)
}
}
希望有用! :)
AWS AppSync 突变在尝试执行更新操作时抛出错误。我已经正确创建了 table 和我的
下面是 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
}
Bellow 是突变的解析器
{
"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,但它仍然会抛出错误。
它会抛出错误,因为您试图使用 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)
}
}
希望有用! :)