AWS AppSync-DeleteItem不执行响应映射模板

时间:2019-02-26 04:15:27

标签: amazon-dynamodb aws-appsync vtl

使用以下请求映射尝试删除项目时:

{
  "version" : "2017-02-28",
  "operation" : "DeleteItem",
  "key" : {
      "id": { "S" : "$ctx.args.id"},
      "sortKey" : { "S" : "$ctx.args.sortKey"}
  }
}

如果该项目存在,它将通过响应模板处理结果,但是,如果该项目不存在,则永远不会运行该响应模板。

响应模板:

#set($ctx.result.status = "SUCCESS")
#set($ctx.result.message = "This was a success!")
$utils.toJson($ctx.result)

我知道,当Dynamo中不存在某个项目时,它将不会执行任何操作,但是我希望它仍然可以在模板中进行处理。

当文档不存在时,我是否缺少任何内容,或者AppSync是否无法通过响应映射处理DeleteItem请求?

1 个答案:

答案 0 :(得分:2)

这是您正在使用的模板版本(2017-02-28)的预期执行行为。

您可以将请求映射模板版本切换为2018-05-29,然后将执行具有以下特征的响应映射模板:

  • 如果数据源调用结果为null,则执行响应映射模板。

  • 如果数据源调用产生错误,则现在由您来处理错误。可以使用$ctx.error访问调用错误。

  • 响应映射模板评估结果将始终放置在GraphQL响应数据块中。您还可以分别使用$util.error()$util.appendError()引发或附加错误。

更多信息https://docs.aws.amazon.com/appsync/latest/devguide/resolver-mapping-template-changelog.html#aws-appsync-resolver-mapping-template-version-2018-05-29

因此,您的示例:

{
  "version" : "2018-05-29", ## Note the new version
  "operation" : "DeleteItem",
  "key" : {
      "id": { "S" : "$ctx.args.id"},
      "sortKey" : { "S" : "$ctx.args.sortKey"}
  }
}

和响应模板

#if ( $ctx.error )
    $util.error($ctx.error.message, $ctx.error.type)
#end
#set($ctx.result.status = "SUCCESS")
#set($ctx.result.message = "This was a success!")
$utils.toJson($ctx.result)