0

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

{
  "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 请求?

4

1 回答 1

2

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

您可以切换您的请求映射模板版本,2018-05-29并执行您的响应映​​射模板,具有以下特点:

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

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

  • 响应映射模板评估结果将始终放置在 GraphQL 响应数据块中。$util.error()您还可以分别使用and引发或附加错误$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)
于 2019-02-26T20:08:14.180 回答