繁体   English   中英

AWS Lambda-API 网关“消息”:“内部服务器错误”(502 错误网关)

[英]AWS Lambda-API gateway "message": "Internal server error" (502 Bad Gateway)

我创建了一个简单的 AWS Lambda 函数来使用 python 3.6 将两个数字相加。 它读取 json 正文中的val1val2值。 当我在 lambda 控制台中测试 lambda 函数时,它工作正常。 但是,当我使用 POSTMAN 通过 AWS API 网关通过 POST 请求调用 lambda 函数时,它响应“消息”:“内部服务器错误”(502 错误网关)。 谁能帮我解决这个错误?

Lambda 函数

import json
def lambda_handler(event, context):
    # TODO implement
    val1 = int(event['val1'])
    val2 = int(event['val2'])
    val3 = val1 + val2
    return {
        'statusCode': 200,
        'headers': {'Content-Type': 'application/json'},
        'body': json.dumps(val3)
    }

JSON 正文

{
    "val1": "3",
    "val2": "5"
}

发生此错误是由于事件对象(python 字典)的行为。 当您在 lambda 控制台中测试 lambda 函数时,JSON 主体将直接传递给事件对象。 但是当您通过 API 网关尝试时,不仅事件对象是请求负载,而且正文属性也被设置为字符串。

例如,您的 JSON 正文在事件对象中将是这样的

body: "{\n    \"val1\": \"3\",\n    \"val2\": \"5\"\n}"

要解决此错误,请尝试使用 json.loads() 方法将正文字符串转换为 json。

import json
def lambda_handler(event, context):
    # TODO implement
    try:
        event = json.loads(event['body'])
        val1 = int(event['val1'])
        val2 = int(event['val2'])
        val3 = val1 + val2
    except:
        val3 = 'request error'
    return {
        'statusCode': 200,
        'headers': {'Content-Type': 'application/json'},
        'body': json.dumps(val3)
    }

我最终遇到了同样的错误,只是我使用的是无服务器和 Node.js。 我在没有在正文上使用 stringify 的情况下返回了一个 HTTP 响应。 如下面的坏例子所示:

坏的:

return {
            statusCode,
            body: body.message,
            headers: {
                "Access-Control-Allow-Origin": "*",
                "Access-Control-Allow-Credentials": true,
            },
        };
    };
}

好的:

return {
            statusCode,
            body: JSON.stringify(body.message),
            headers: {
                "Access-Control-Allow-Origin": "*",
                "Access-Control-Allow-Credentials": true,
            },
        };
    };
}

我希望这可以帮助其他可能遇到 502 错误的人。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM