jjb*_*kir 59 amazon-web-services node.js aws-lambda aws-api-gateway
我正在尝试使用AWS lambda建立一个hello world示例并通过api网关提供它.我点击了"创建一个Lambda函数",它设置了api gatway并选择了Blank Function选项.我添加了AWS网关入门指南中的lambda函数:
exports.handler = function(event, context, callback) {
callback(null, {"Hello":"World"}); // SUCCESS with message
};
Run Code Online (Sandbox Code Playgroud)
问题是,当我向它发出GET请求时,它返回502响应{ "message": "Internal server error" }.并且日志显示"由于配置错误导致执行失败:格式错误的Lambda代理响应".
Ka *_*ong 78
通常,当您看到时Malformed Lambda proxy response,这意味着您的Lambda函数的响应与API Gateway期望的格式不匹配,就像这样
{
"isBase64Encoded": true|false,
"statusCode": httpStatusCode,
"headers": { "headerName": "headerValue", ... },
"body": "..."
}
Run Code Online (Sandbox Code Playgroud)
如果您未使用Lambda代理集成,则可以登录API Gateway控制台并取消选中Lambda代理集成复选框.
此外,如果您看到间歇性 Malformed Lambda proxy response,则可能意味着对Lambda函数的请求已被Lambda限制,并且您需要请求Lambda函数的并发执行限制增加.
sel*_*t91 40
如果lambda用作代理,那么响应格式应该是
{
"isBase64Encoded": true|false,
"statusCode": httpStatusCode,
"headers": { "headerName": "headerValue", ... },
"body": "..."
}
Run Code Online (Sandbox Code Playgroud)
Mrk*_*dig 25
是的所以我认为这是因为你实际上没有在那里返回正确的http响应,这就是你得到错误的原因.
我个人使用一组这样的函数:
module.exports = {
success: (result) => {
return {
statusCode: 200,
headers: {
"Access-Control-Allow-Origin" : "*", // Required for CORS support to work
"Access-Control-Allow-Credentials" : true // Required for cookies, authorization headers with HTTPS
},
body: JSON.stringify(result),
}
},
internalServerError: (msg) => {
return {
statusCode: 500,
headers: {
"Access-Control-Allow-Origin" : "*", // Required for CORS support to work
"Access-Control-Allow-Credentials" : true // Required for cookies, authorization headers with HTTPS
},
body: JSON.stringify({
statusCode: 500,
error: 'Internal Server Error',
internalError: JSON.stringify(msg),
}),
}
}
} // add more responses here.
Run Code Online (Sandbox Code Playgroud)
然后你只需:
var responder = require('responder')
// some code
callback(null, responder.success({ message: 'hello world'}))
Run Code Online (Sandbox Code Playgroud)
max*_*paj 20
您的 Node.js 处理程序需要返回 Promise 或使用回调函数。
我遇到了这个问题,它源于一个看起来完全正常的无效处理程序代码:
exports.handler = (event, context) => {
return {
isBase64Encoded: false,
body: JSON.stringify({ foo: "bar" }),
headers: {
'Access-Control-Allow-Origin': '*',
},
statusCode: 200,
};
}
Run Code Online (Sandbox Code Playgroud)
该处理程序之前是在async没有使用过的情况下声明的await,因此我删除了该async关键字,但没有意识到 Lambda 期望您的处理程序函数返回 Promise(异步/等待)或调用回调。
我通过检查有些令人困惑的 API Gateway 响应日志得到了提示:
> Endpoint response body before transformations: null
Run Code Online (Sandbox Code Playgroud)
修复它的方法是
exports.handler = (event, context) => {
return new Promise((resolve) => resolve({
isBase64Encoded: false,
body: JSON.stringify({ foo: "bar" }),
headers: {
'Access-Control-Allow-Origin': '*',
},
statusCode: 200,
}));
}
Run Code Online (Sandbox Code Playgroud)
exports.handler = (event, context, callback) => {
callback({
isBase64Encoded: false,
body: JSON.stringify({ foo: "bar" }),
headers: {
'Access-Control-Allow-Origin': '*',
},
statusCode: 200,
});
}
Run Code Online (Sandbox Code Playgroud)
async关键字(异步函数隐式返回 Promise),我不推荐这种方法,因为其他一些开发人员或 IDE 重构工具会出现并删除据称不必要的内容async:exports.handler = async (event, context) => {
return {
isBase64Encoded: false,
body: JSON.stringify({ foo: "bar" }),
headers: {
'Access-Control-Allow-Origin': '*',
},
statusCode: 200,
};
}
Run Code Online (Sandbox Code Playgroud)
对于 Python3:
import json
def lambda_handler(event, context):
return {
'statusCode': 200,
'headers': {
'Content-Type': 'application/json',
'Access-Control-Allow-Origin': '*'
},
'body': json.dumps({
'success': True
}),
"isBase64Encoded": False
}
Run Code Online (Sandbox Code Playgroud)
注意body不需要设置,它可以是空的:
'body': ''
Run Code Online (Sandbox Code Playgroud)
只是一段.net core和C#的代码:
using Amazon.Lambda.APIGatewayEvents;
...
var response = new APIGatewayProxyResponse
{
StatusCode = (int)HttpStatusCode.OK,
Body = JsonConvert.SerializeObject(new { msg = "Welcome to Belarus! :)" }),
Headers = new Dictionary<string, string> { { "Content-Type", "application/json" } }
};
return response;
Run Code Online (Sandbox Code Playgroud)
lambda 的响应将是:
{"statusCode":200,"headers":{"Content-Type":"application/json"},"multiValueHeaders":null,"body":"{\"msg\":\"Welcome to Belarus! :)\"}","isBase64Encoded":false}
Run Code Online (Sandbox Code Playgroud)
API 网关的响应将是:
{"msg":"Welcome to Belarus! :)"}
Run Code Online (Sandbox Code Playgroud)
对于那些在回应看似有效时感到挣扎的人。这不起作用:
callback(null,JSON.stringify( {
isBase64Encoded: false,
statusCode: 200,
headers: { 'headerName': 'headerValue' },
body: 'hello world'
})
Run Code Online (Sandbox Code Playgroud)
但这确实:
callback(null,JSON.stringify( {
'isBase64Encoded': false,
'statusCode': 200,
'headers': { 'headerName': 'headerValue' },
'body': 'hello world'
})
Run Code Online (Sandbox Code Playgroud)
此外,响应对象上似乎不允许出现额外的键。
我已经尝试了上述所有建议,但它不起作用,而body价值不是String
return {
statusCode: 200,
headers: {
"Content-Type": "application/json",
"Access-Control-Allow-Origin": "*"
},
body: JSON.stringify({
success: true
}),
isBase64Encoded: false
};
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
27753 次 |
| 最近记录: |