[英]How exactly does Lambda Error Regex work for custom errors?
我知道Lambda代理集成,但是对Lambda自定义代理感到好奇。 为了捕获自定义错误,我将在Integration Response中定义与以下Lambda函数关联的正则表达式:
exports.handler = (event, context, callback) => {
...
// Error caught here:
var myErrorObj = {
errorType : "InternalServerError",
httpStatus : 500,
requestId : context.awsRequestId,
trace : {
"function": "abc()",
"line": 123,
"file": "abc.js"
}
}
callback(JSON.stringify(myErrorObj));
};
根据doc :“当您的API方法与前面的Lambda函数集成时,API网关会收到具有以下有效负载的集成响应”
{
"errorMessage": "{\"errorType\":\"InternalServerError\",\"httpStatus\":500,\"requestId\":\"e5849002-39a0-11e7-a419-5bb5807c9fb2\",\"trace\":{\"function\":\"abc()\",\"line\":123,\"file\":\"abc.js\"}}"
}
请注意, httpStatus\\":500
内有一个反斜杠(我们称之为目标),因此从逻辑上讲Lambda Error Regex应该类似于.*httpStatus\\\\":500.*
,也就是说,它应该转义反斜杠,以便它可以抓住那个目标。 但是,此类正则表达式无法捕获错误,而是.*"httpStatus":500.*
捕获错误。 后者的正则表达式通常会捕获术语httpStatus":500
。但这与文档相矛盾。换句话说,似乎API网关的正则表达式不扫描文档解释的字符串?因此,它到底要扫描什么?两者之间到底发生了什么?
{
"errorMessage": "{\"errorType\":\"InternalServerError\",\"httpStatus\":500,\"requestId\":\"e5849002-39a0-11e7-a419-5bb5807c9fb2\",\"trace\":{\"function\":\"abc()\",\"line\":123,\"file\":\"abc.js\"}}"
}
这是API网关从Lambda接收的原始响应有效负载 。 这是一个JSON对象,包含您的errorMessage
字符串,其中包含一个JSON对象(放置在该对象中)。 Lambda再次将JSON.stringify修改为有线响应,就像它设计的那样。
尝试直接解析有效负载是不合适的,因此,一旦将有效负载解码,就删除了JSON序列化的最外层,以便将正则表达式准确地应用于错误消息字符串,就像将其传递给回调一样。 反斜杠转义的引号是JSON-in-JSON的人工产物,在第一个解码步骤发生时将其删除。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.