Почему-то не могу успешно вернуть правильно отформатированные сообщения об ошибках при использовании API Gateway и Lambda.Со следующим лямбда-кодом:
var myErrorObject = {
httpStatus: status,
errorType : thisErrorType,
message : errorMessage
}
return JSON.stringify(myErrorObject);
В Cloud Watch я вижу следующее:
{
"errorMessage": "{\"httpStatus\":401,\"errorType\":\"Unauthorized\",\"message\":\"Supplied PAC is incorrect.\"}"
}
Теперь внутри шлюза API я поместил запись в ответ интеграции, чтобы поймать этоcase: Регулярное выражение лямбда-ошибки: httpStatus ": 401. Кажется, это ловит его. Если я изменяю его, ответ пролетает по умолчанию с кодом 200. Таким образом, он определенно видит его.
Последним фрагментом головоломки, который, как мне кажется, является корнем проблемы, является шаблон отображения. Я попробовал несколько вещей, все application / json и passthrough:
1-е, что я пробовал: $ input.path ('$. errorMessage')
2-я попытка:
#set ($errorMessageObj = $util.parseJson($input.path('$.errorMessage')))
{
"type" : "$errorMessageObj.errorType",
"message" : "$errorMessageObj.message"
}
и т. д. Я перепробовал множество вещей. Преобразование в текст также. Но я думаю, что ямне не хватает фундаментального понимания кода, который я использую. Я полагаю, что эта часть использует Apache Velocity. До этого я никогда не слышал об этом. Я ожидаю увидеть 401 с другой стороны, с типом и сообщением внутри телаСообщение об ошибке. Я вижу401. Но никаких признаков того, что 2 предмета я хотел отозвать в ответе.Если я просто удаляю этот 401, он проходит как 200, и я могу видеть информацию.Итак, у меня почти искушение отказаться от всего этого подхода и вручную получить информацию.Но это было бы грязно.И я почти уверен, что это почти правильно.
Обновление
Я изменил шаблон отображения на:
#set ($errorMessageObj = $util.escapeJavaScript(
$input.path('$.errorMessage')).replaceAll("\\'",'\"'))
$errorMessageObj
И в результате я теперь вижу следующее в CloudWatch (на API-шлюзе):
Method response body after transformations: {\"httpStatus\":404,\"errorType\":\"NotFound\",\"message\":\"Device does not exist!\"}
А в браузере тело ответа выглядит так:
_body: "{\"httpStatus\":404,\"errorType\":\"NotFound\",\"message\":\"Device does not exist!\"}"
Что является мусором.Я хочу правильно отформатированный объект JSON, с которым я могу работать, не анализируя его.Может ли кто-нибудь выявить недостаток в подходе сопоставления тела ответа.Любые эксперты по скорости Apache хотят поделиться мудростью?