rab*_*ens 5 f# amazon-web-services aws-lambda aws-api-gateway
我有一个绑定到 AWS API 网关的 Lambda 函数。当我喜欢的东西把它/foo/bar
和bar
不存在的,我的函数返回(正确地)是这样的:
{
"code": 404,
"message": "bar not found"
}
Run Code Online (Sandbox Code Playgroud)
我现在也希望它的状态代码是 404,但是按照我在网上可以找到的教程,到目前为止我没有成功。我做了什么:
据我了解,当404
出现在响应文档中时,这应该将代码设置为 404 ,但我仍然得到200
.
我错过了什么?
我进一步调查了一些,发现 API 网关非常挑剔它期望它的错误消息的位置,以及我必须如何将它们取出。
在文档中很难找到该errorMessage
属性被认为与 Lambda 错误正则表达式匹配,并且在文档中很难找到,并且这篇文章的第一个答案指出您在使用 Java 8 时必须抛出异常。我将 .net 用于我的 Lambda函数,所以我做了这个非常简单的事情:
new Exception("404") |> raise
Run Code Online (Sandbox Code Playgroud)
然后我设置了 Lambda 错误正则表达式404
并且它起作用了。
我尝试的下一件事是:
new Exception("foo 404 bar") |> raise
Run Code Online (Sandbox Code Playgroud)
使用正则表达式.*404.*
它仍然有效。
现在事情来了:我试图发出一个 JSON 对象作为错误,但我在 C# 或 F# 中找不到任何东西让我这样做,所以我想出了以下内容:
type Error = {
code: int
message: string
}
...
new Exception({ code = 404; message = name |> sprintf "%s not found" } |> JsonConvert.SerializeObject) |> raise
Run Code Online (Sandbox Code Playgroud)
繁荣,我又得到了 200。
所以我由此得出结论,AWS 不喜欢errorMessage
属性中的字符串化 JSON ,所以我现在只输出一个像这样的简单字符串:
new Exception(name |> sprintf "404: %s not found") |> raise
Run Code Online (Sandbox Code Playgroud)
并使用正则表达式404:.*
,它现在可以工作了。这意味着,我必须以某种方式使用 API 网关中的映射来构建我想要的输出对象。
这很不方便,而且很容易绊倒……