使用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);
};
答案 0 :(得分:1)
我知道了。解决方案是使用$input.json()
而不是$input.path()
这是我新的映射模板
{
"errorMessage" : $input.json('$.errorMessage')
}