由于某些原因,使用API Gateway和Lambda时,我无法成功返回正确格式的错误消息。使用以下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网关内部,我已在集成响应中添加了一个条目来捕获这种情况:Lambda错误正则表达式为。 httpStatus“:401。这似乎可以捕获它。如果我更改它,响应会通过默认代码200飞过。因此,肯定可以看到它。
最后一个难题,我认为问题的根源是映射模板。我已经尝试了几件事,所有的application / json和passthrough:
我尝试过的第一件事: $ input.path('$。errorMessage')
第二次尝试:
#set ($errorMessageObj = $util.parseJson($input.path('$.errorMessage')))
{
"type" : "$errorMessageObj.errorType",
"message" : "$errorMessageObj.message"
}
等我已经尝试了很多东西。也转换为文本。但是我认为我对所使用的代码缺乏基本的了解。我收集的这部分使用Apache Velocity。在此之前我从未听说过。我希望看到另一面出现401,其类型和消息位于hte错误消息的主体内。我确实看到了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速度专家愿意分享一些智慧?