来自Lambda的AWS API Gateway集成响应正文映射错误代码

时间:2019-02-18 02:05:10

标签: javascript amazon-web-services aws-lambda aws-api-gateway apache-velocity

由于某些原因,使用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速度专家愿意分享一些智慧?

0 个答案:

没有答案