【问题标题】:How to handle error with Gateway API and Lambda Proxy?如何处理网关 API 和 Lambda 代理的错误?
【发布时间】:2019-11-23 19:33:12
【问题描述】:

当出现问题时,我会从 Node.js 中的 Lambda 回复以下内容:

            if (error) {
                logger.error(error.errorMessage, error.stack);
                callback('Error getting some data', {
                    statusCode: 500,
                    headers: {"Access-Control-Allow-Origin": "*"}
                });
            }

直接从网关 API 控制台测试端点我可以看到以下响应:

总结:

  1. 我从 Lambda 响应 500 错误
  2. 在 API 中我可以看到 502 错误响应

有人能解释一下这种奇怪的行为吗?

【问题讨论】:

  • 如果 Lambda 函数正在运行,您是否能够转到为您的 Lambda 创建的 CloudWatch 日志流进行调试。您确定您有从 API 网关设置到您的 Lambda 函数的代理集成吗? API 网关是否有权调用 Lambda 函数?
  • 是的,lambda 函数正在运行,我可以在 Cloudwatch 中看到日志。是的,它是一个代理集成 lambda。除了错误响应之外,一切正常。当我从同一个 lambda 返回 200 时,一切都很好。只有错误响应看起来很奇怪。

标签: jquery amazon-web-services aws-lambda aws-api-gateway aws-serverless


【解决方案1】:

问题出在回调函数的第一个参数上。我正在这样做:

if (error) {
   logger.error(error.errorMessage, error.stack);
   callback('Error getting some data', {
      statusCode: 500,
      headers: {"Access-Control-Allow-Origin": "*"}
   });
}

当我需要将 null 作为第一个参数传递给回调时。例如:

if (error) {
   logger.error(error.errorMessage, error.stack);
   callback(null, {
       statusCode: 500,
       headers: {"Access-Control-Allow-Origin": "*"}
   });
}

另一种选择是直接返回对象而不调用回调函数。

exports.handler = async (event) => {
   return response = {
            statusCode: 500,
            headers: {"Access-Control-Allow-Origin": "*"},
            body: JSON.stringify({
                errorMessage: "This is a custom internal server error"
            })
        };
};

为什么?我的猜测是,回调的第一个参数仅在您自定义网关 API 的响应时才被评估。换句话说,当您没有与您的 lambda 进行代理集成时。

但我不能 100% 确定。也许有人可以给出更好的解释。

【讨论】:

    猜你喜欢
    • 2020-08-05
    • 2017-09-28
    • 1970-01-01
    • 2023-04-09
    • 2023-03-04
    • 2017-04-07
    • 1970-01-01
    相关资源
    最近更新 更多