【问题标题】:AWS: APIGateway custom response regex fails to matchAWS:APIGateway 自定义响应正则表达式无法匹配
【发布时间】:2020-06-13 01:15:23
【问题描述】:

如果用户在标头中缺少必填字段,我正在尝试发送 API 网关响应代码 401。我的 lambda 响应如下:

{
    "status": "Unauthorized user",
    "body": ["username"]
}

在 AWS API Gateway -> myAPI -> 资源 -> PUT 操作 -> 集成响应中,我有 2 个条目。
1。对于默认 RegEx 模式(空白)的所有成功 --> 方法响应状态为 201
2。对于正则表达式匹配,如果我使用正则表达式或在线 regex101.com 使用高于 JSON 和低于正则表达式,则存在完全匹配。

.*\"Unauthorized user\".*

但是,在 API 测试期间同样失败并显示以下消息

<date_time in UTC> : Endpoint response body before transformations: {"status": "Unauthorized user", "body": ["username"] }
<date_time in UTC> : Execution failed due to configuration error: No match for output mapping and no default output mapping configured. Endpoint Response Status Code: 200
<date_time in UTC> : Method completed with status: 500

有人遇到过这种情况吗?如果我有 201 和空白正则表达式,我最终会得到 201...不管未经授权或内部错误或错误请求。

【问题讨论】:

  • 是的;在重新阅读docs 之后,我什至尝试将正则表达式设置为 .* ,它警告说它实际上会使其成为默认响应。而且我仍然得到 200s 而不是错误代码。

标签: amazon-web-services api-gateway


【解决方案1】:

这是您问题中的图片:

注意第一列的标题是如何写的Lambda Error Regex?这意味着 API Gateway 只会尝试将该正则表达式与 Lambda 返回的错误进行匹配。但是 API 网关如何知道 Lambda 返回的是真实响应还是错误?它根据 Lambda returned 响应或 threw 异常来知道这一点。

您的正则表达式不匹配,因为您返回了响应而不是将其作为异常抛出!

看看这个:

当我的 Node.js Lambda 执行此操作时:

exports.handler = async (event) => {
    const response = {
        "status": "Unauthorized user",
        "body": ["username"]
    }
    return response
}

我的 API 网关会这样做:

但是当同一个 Lambda 这样做时:

exports.handler = async (event) => {
    const error = {
        "status": "Unauthorized user",
        "body": ["username"]
    }
    throw JSON.stringify(error)
}

API 网关会这样做:

【讨论】:

  • 这绝对是我的答案的一部分。最终似乎还有其他东西,因为 .* 没有按预期工作,但是当我使用一个正则表达式时,它会发现整行错误消息,它开始按预期工作。
猜你喜欢
  • 2021-04-07
  • 1970-01-01
  • 2022-08-17
  • 1970-01-01
  • 2018-07-13
  • 1970-01-01
  • 2018-05-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多