【问题标题】:Handling errors in aws lambda in serverless在无服务器中处理 aws lambda 中的错误
【发布时间】:2023-04-07 07:27:01
【问题描述】:

我正在尝试从我的 lambda 函数返回错误,但对于所有错误,它只返回状态 502 和消息 Internal server error。以前它只是为所有类型的返回错误返回cors 错误。在 api 网关响应中添加 'Access-Control-Allow-Origin' : '*' 后,我收到 502 错误。我在 catch 块中记录了抛出的错误,我可以在 CloudWatch 中看到具体错误。我已经看到了这个question,但这并没有帮助。请注意,我使用的是async await,而不是使用callback。我也试过没有lambda-proxy集成,但响应是一样的。在lambda-proxy 的情况下我需要配置其他东西吗?

const test = async (event, context) => {
  try {
    context.callbackWaitsForEmptyEventLoop = false;
    const error = { status: 400, message: 'my custom error' };
    throw error;
  } catch(error) {
    console.log('==== error ====', error);

    return createErrorResponse(error.status || 500, error.errors || error.message);
  }

创建错误响应

const createErrorResponse = (statusCode, message, stack={}) => ({
  statusCode,
  headers: {
    'Access-Control-Allow-Origin' : '*',
    'Access-Control-Allow-Credentials': true,
  },
  body: JSON.stringify({
    error: message
  }),
  stack: JSON.stringify({ stack })
});

export default createErrorResponse;

serverless.yml

test:
    handler: api/index.test
    timeout: 360
    events:
      - http:
          path: test-lambda-api
          method: post
          cors: true

【问题讨论】:

    标签: node.js aws-lambda aws-api-gateway serverless


    【解决方案1】:

    当使用 Lambda 代理与 API Gateway 集成时,来自 Lambda 的响应应为特定格式:

    var response = {
        "statusCode": 200,
        "headers": {
            "my_header": "my_value"
        },
        "body": JSON.stringify(responseBody),
        "isBase64Encoded": false
    };
    

    body 本身中包含您的 stack JSON 密钥。您也可以参考这篇文章了解更多信息:https://aws.amazon.com/premiumsupport/knowledge-center/malformed-502-api-gateway/

    此外,您应该为 API Gateway 阶段启用调试日志,以便更好地了解从 API GW 集成发送和接收的内容。

    【讨论】:

    • 只有缺少的isBase64Encoded 键会造成问题。谢谢!
    • @Kamran Arshad 您是如何最终发送“堆栈”JSON 密钥的?
    • 我只是将它用于开发目的,而不是返回响应,但我认为这应该通过将它添加到正文中来处理,就像你提到的那样
    猜你喜欢
    • 2019-12-03
    • 2018-03-19
    • 1970-01-01
    • 2021-04-07
    • 2021-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-08
    相关资源
    最近更新 更多