Интеграция AWS API Gateway Коды ошибок отображения тела ответа от Lambda - PullRequest
0 голосов
/ 18 февраля 2019

Почему-то не могу успешно вернуть правильно отформатированные сообщения об ошибках при использовании 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 хотят поделиться мудростью?

...