AWS AppSync - DeleteItem не выполняет шаблон сопоставления ответов

При попытке удалить элемент, используя следующее сопоставление запроса:

{
  "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)

Я знаю, что когда элемент не существует в Динамо, он не будет выполнять никаких действий, но я ожидаю, что он все равно будет обрабатываться через шаблон.

Есть ли что-то, чего мне не хватает, или AppSync не может обработать запрос DeleteItem посредством сопоставления ответов, когда документ не существует?

1 ответ

Это ожидаемое поведение при исполнении используемой версии шаблона (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

Итак, для вашего примера:

{
  "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)
Другие вопросы по тегам