我是 Amazon Lambda-API 实现的初学者。
我只是部署一个非常简单的 API:一个非常简单的 lambda 函数,使用 Python 2.7 打印“Hello World”,我使用 API Gateway 触发该函数。但是,当我单击 Invoke URL 链接时,它告诉我“{“message”:“内部服务器错误”}”。
因此,我试图看看这里出了什么问题,所以我单击 API 本身,我可以在方法执行中看到以下内容呈灰色:“集成响应:代理集成无法配置为转换响应。”
我测试了许多不同的配置,但仍然面临同样的错误。我不知道为什么这一步是灰色的。
我在尝试集成API网关和lambda函数时遇到了同样的问题。基本上,花了几个小时后,我就明白了。 因此,当您创建新资源或方法时,默认设置使用 Lambda 代理集成。
所以你需要删除它。按照集成请求并取消选中使用 Lambda 代理集成
然后在Resources、Atction选项卡中,选择Enable CORS
完成后,再次部署您的 API 并测试功能。 此外,本主题将解释幕后发生的事情。
祝你好运...
Lambda 响应应采用特定格式供 API 网关处理。你可以在帖子中找到详细信息。 https://aws.amazon.com/premiumsupport/knowledge-center/malformed-502-api-gateway/
exports.handler = (event, context, callback) => {
var responseBody = {
"key3": "value3",
"key2": "value2",
"key1": "value1"
};
var response = {
"statusCode": 200,
"headers": {
"my_header": "my_value"
},
"body": JSON.stringify(responseBody),
"isBase64Encoded": false
};
callback(null, response);
当我开发前端时,我的 API 可以在 Postman 中运行,但不能在本地运行。当我尝试在我的资源上启用 CORS 进行 GET、POST 和 OPTIONS 时,我遇到了同样的错误,在搜索了 @aditya 答案后,我走上了正确的道路,但我不得不稍微调整我的代码。
我需要添加
res.statusCode
和两个标题,它开始工作。
// GET
// get all myModel
app.get('/models/', (req, res) => {
const query = 'SELECT * FROM MyTable'
pool.query(query, (err, results, fields) => {
//...
const models = [...results]
const response = {
data: models,
message: 'All models successfully retrieved.',
}
//****** needed to add the next 3 lines
res.statusCode = 200;
res.setHeader('content-type', 'application/json');
res.setHeader('Access-Control-Allow-Origin', '*');
res.send(response)
})
})
如果您使用 terraform 进行 aws 资源配置,您可以设置 “aws_api_gateway_integration” type =“AWS”而不是“AWS_PROXY”,这应该可以解决您的问题。
我在尝试使 Lambda 函数包装器为 API 网关可见的异常生成标准错误响应时遇到了类似的问题。
我尝试了响应模型、基于选择模式的集成响应,但没有任何效果。最终的解决方案是不依赖 Lambda 函数包装器来生成异常的 JSON 表示形式,并按照 API 网关响应格式构建我自己的错误响应,其中包含 isBase64Encoded、statusCode、标头和正文字段。