Как отправить пользовательскую ошибку в AppSync с помощью $util.error
У меня есть вопрос об обработке ошибок AppSync. Я хотел бы отправить объект errorInfo вместе с ответом об ошибке, и я попытался с помощью $util.error. Согласно документу:
https://docs.aws.amazon.com/appsync/latest/devguide/resolver-util-reference.html
$ util.error (String, String, Object, Object)
Выдает пользовательскую ошибку. Это может использоваться в шаблонах сопоставления запроса или ответа, если шаблон обнаруживает ошибку в запросе или в результате вызова. Кроме того, можно указать поле errorType, поле данных и поле errorInfo. Значение данных будет добавлено в соответствующий блок ошибок внутри ошибок в ответе GraphQL. Примечание: данные будут отфильтрованы на основе выбранного набора запросов. Значение errorInfo будет добавлено в соответствующий блок ошибок внутри ошибок в ответе GraphQL. Примечание: errorInfo НЕ будет фильтроваться на основе набора выбора запроса.
А вот как выглядит мой ResponseMappingTemplate:
#if( $context.result && $context.result.errorMessage )
$utils.error($context.result.errorMessage, $context.result.errorType, $context.result.data), $context.result.errorInfo)
#else
$utils.toJson($context.result.data)
#end
Вот что я сделал на резольвере:
var result = {
data: null,
errorMessage: 'I made this error',
errorType: 'ALWAYS_ERROR',
errorInfo: {
errorCode: 500,
validations: [
{
fieldName: '_',
result: false,
reasons: [
'Failed! Yay!'
]
}
],
}
};
callback(null, result);
И вот что я вижу в логе cloudwatch:
{
"errors": [
"CustomTemplateException(message=I made this error, errorType=ALWAYS_ERROR, data=null, errorInfo={errorCode=500, validations=[{fieldName=_, result=false, reasons=[Failed! Yay!]}]})"
],
"mappingTemplateType": "Response Mapping",
"path": "[getError]",
"resolverArn": "arn:aws:appsync:ap-southeast-1:....",
"context": {
"arguments": {},
"result": {
"errorMessage": "I made this error",
"errorType": "ALWAYS_ERROR",
"errorInfo": {
"errorCode": 500,
"validations": [
{
"fieldName": "_",
"result": false,
"reasons": [
"Failed! Yay!"
]
}
]
}
},
"stash": {},
"outErrors": []
},
"fieldInError": true
}
И вот что я получил в ответе:
{
"data": {
"getError": null
},
"errors": [
{
"path": [
"getError"
],
"data": null,
"errorType": "ALWAYS_ERROR",
"errorInfo": null,
"locations": [
{
"line": 2,
"column": 3,
"sourceName": null
}
],
"message": "I made this error"
}
]
}
Обратите внимание, что errorInfo имеет значение null, и я кое-как получил CustomTemplateException. Я подозреваю, что это из-за 4-го параметра в $utils.error. Но я не знаю почему. Может ли кто-нибудь помочь указать на ошибку или сказать, возможна ли отправка пользовательского errorInfo
1 ответ
Оказалось, что я использовал код из какого-то учебника, который не обновлен. Существует 2 версии шаблона сопоставления резольвера: "2018-05-29" и "2017-02-28". Поэтому мне нужно изменить версию шаблона на "2018-05-29", чтобы она работала.
RequestMappingTemplate: |
{
"version": "2018-05-29",
"operation": "Invoke",
"payload": {
"field": "getError",
"arguments": $utils.toJson($context.arguments)
}
}
Смотрите изменения между двумя версиями здесь: https://docs.aws.amazon.com/appsync/latest/devguide/resolver-mapping-template-changelog.html