AWS API Gateway:无法使用集成响应将抛出的错误从Lambda映射到方法响应

时间:2018-12-17 19:11:14

标签: amazon-web-services aws-lambda aws-api-gateway

问题

使用AWS API Gateway的Integration Response功能,我可以成功处理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是我抛出的错误消息中的第一个字符,用于匹配Lambda错误正则表达式。我在将第一个字母短暂更改为X并得到Unexpected 'X'作为响应时就知道了。

当我将映射模板的第一行更改为此(映射整个对象而不是尝试仅映射errorMessage属性)

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

我仅从Javascript错误对象获得堆栈跟踪。

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

这表明,返回到API网关的 entire 响应对象只是Javascript错误中的stackTrace属性。但是对我来说,这没有意义,因为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 :(得分:1)

我知道了。解决方案是使用$input.json()而不是$input.path()

这是我新的映射模板

{
    "errorMessage" : $input.json('$.errorMessage')
}