amazon-web-services - AWS API 网关 : Regex for error is not picked up

标签 amazon-web-services f# aws-lambda aws-api-gateway

我有一个绑定(bind)到 AWS API 网关的 Lambda 函数。当我用 /foo/bar 之类的东西调用它时和 bar不存在,我的函数返回(正确)类似于:

{
  "code": 404,
  "message": "bar not found"
}

我现在也希望它的状态码是 404,但是按照我在网上找到的教程,我到目前为止还没有成功。我做了什么:

我为 404 创建了一个方法响应,如下所示:
404 response

在集成响应中,我设置了以下内容:
404 integration response

据我了解,这应该在 404 时将代码设置为 404出现在响应文档中,但我仍然得到 200 .

我错过了什么?

最佳答案

我进行了更多调查,发现 API 网关对错误消息的预期位置非常挑剔,以及我必须如何将它们取出。

深埋在the documentation不容易被发现该errorMessage属性被考虑与 Lambda 错误正则表达式匹配,first answer to this post声明在使用 Java 8 时必须抛出异常。我将 .net 用于我的 Lambda 函数,所以我做了这个非常简单的事情:

new Exception("404") |> raise

然后我设置了 Lambda 错误正则表达式 404它奏效了。

接下来我尝试的是:
new Exception("foo 404 bar") |> raise

使用正则表达式 .*404.*它仍然有效。

现在事情来了:我试图发出一个 JSON 对象作为错误,但我在 C# 或 F# 中没有发现任何东西可以让我这样做,所以我想出了以下内容:
type Error = {
    code: int
    message: string
}

...

new Exception({ code = 404; message = name |> sprintf "%s not found" } |> JsonConvert.SerializeObject) |> raise

繁荣,我又得到了200。

所以我由此得出结论,AWS 不喜欢 errorMessage 中的字符串化 JSON。属性,所以我现在只输出一个像这样的简单字符串:
new Exception(name |> sprintf "404: %s not found") |> raise

并使用正则表达式 404:.* ,它现在可以工作了。这意味着,我必须以某种方式使用 API 网关中的映射构造我想要的输出对象。

这很不方便,而且很容易绊倒......

关于amazon-web-services - AWS API 网关 : Regex for error is not picked up,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47498940/

相关文章:

amazon-web-services - 如何使用 AWS-CDK 将 AWS 堆栈的 cfnoutputs 获取到文件

amazon-web-services - 需要为账户 xxx 执行 AWS 调用,但尚未配置任何凭证

linux - AMI内核ID和EC2实例安装的内核有什么关系?

amazon-web-services - 无服务器框架部署错误 : You're not authorized to access this resource

c# - 支持 C# 和 F# 的最简单的 Visual Studio

generics - F#中的泛型函数

compiler-construction - 递归下降解析器和函数式编程

python - Python-如何进行身份验证从AWS Lambda咨询Google Analytics(分析)?

python - 如何列出/tmp 文件夹中的文件

mysql - 如何使用 SQLAlchemy 为 RDS 代理设置 TLS