AWS API Gateway: невозможно отобразить сгенерированную ошибку из лямбды в ответ метода с помощью ответа интеграции - PullRequest
0 голосов
/ 17 декабря 2018

Проблема

Используя функцию ответа интеграции AWS API Gateway, я могу успешно обрабатывать ошибки, которые выдает Lambda.Однако у меня возникают проблемы при сопоставлении объекта ошибки Javascript с шаблоном сопоставления.Объект ошибки выглядит следующим образом.

{
    "errorMessage": "Error: ABC123",
    "errorType": "Error",
    "stackTrace": [
        "exports.handler (/var/task/index.js:9:11)"
    ]
}

Вот мое отображение ответа интеграции для application/json

#set($errorMessage = $input.path('$.errorMessage'))
{
    "message" : $errorMessage
}

Что я пробовал

Используя эту конфигурацию, этаполный ответ, возвращенный клиенту: Unexpected 'E'.Это одна строка, которая не содержится в объекте JSON.

Этот E, на который ссылается ошибка, является первым символом в моем выданном сообщении об ошибке, которое используется для соответствия регулярному выражению лямбда-ошибок.Я знаю это, когда я кратко изменил первую букву на X, и я получил Unexpected 'X' в качестве ответа.

Когда я изменяю первую строку моего шаблона отображения на это (отображение всего объекта вместо попыткипросто сопоставить свойство errorMessage)

#set($errorMessage = $input.path('$'))

Я получаю только трассировку стека от объекта ошибки Javascript.

{
    "message" : [
        "exports.handler (/var/task/index.js:9:11)"
    ]
}

Это может означать, что либо whole *Объект ответа 1028 *, возвращаемый в API Gateway, является просто свойством stackTrace из-за ошибки Javascript.Но для меня это не имеет смысла, поскольку что-то воспринимает errorMessage как то, откуда приходит сообщение Unexpected 'E'.

Аналогичным образом, когда я пытаюсь сопоставить свойство errorType, я получаю ту же ошибку, поскольку она также начинается с E.Я могу успешно сопоставить свойство message только при использовании всего входного объекта $ или только свойства stackTrace.

Что я здесь не так делаю?

Прочеекод

Вот модель ошибки шлюза API.Свойство message четко помечено как тип string, но оно работает только тогда, когда я возвращаю массив. Примечание: это код по умолчанию

{
    "$schema" : "http://json-schema.org/draft-04/schema#",
    "title" : "Error Schema",
    "type" : "object",
    "properties" : {
        "message" : { "type" : "string" }
    }
}

Вот код функции Lambda

exports.handler = async (event, context, callback) => {
    throw new Error(Error: ABC123);
};

1 Ответ

0 голосов
/ 17 декабря 2018

Я понял это.Решение состоит в том, чтобы использовать $input.json() вместо $input.path()

Вот мой новый шаблон сопоставления

{
    "errorMessage" : $input.json('$.errorMessage')
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...