Ric*_*rdo 8 amazon-web-services websocket aws-lambda aws-api-gateway
我有一个简单的 Node.js 10.x Lambda 函数,在Lambda 函数控制台上测试时可以正常工作:
exports.handler = async (event) => {
var msg = 'connected';
return {
statusCode: 200,
body: { msg: msg}
};
};
Run Code Online (Sandbox Code Playgroud)
我通过他们的API Gateway 控制台创建了一个WebSocket API,它通过集成集成到它:LAMBDA_PROXY
当我尝试使用wscat连接到它时,出现错误:
wscat -c "wss://awesomeid1.execute-api.us-west-2.amazonaws.com/dev"
error: Unexpected server response: 502
Run Code Online (Sandbox Code Playgroud)
我该如何解决?
额外问题:我们如何找到 Websocket API 连接错误的日志?
没有帮助我修复它的相关链接:
Ric*_*rdo 17
我找到了这个答案的根本原因。基本上,当使用 Lambda 代理集成时,Lambda 函数响应body值需要是string. 我们需要使用JSON.stringify()或类似的东西:
exports.handler = async (event) => {
var msg = 'connected';
return {
statusCode: 200,
body: JSON.stringify({ msg: msg}) /*required on lambda proxy integration*/
};
};
Run Code Online (Sandbox Code Playgroud)
深入研究文档,在用于代理集成的 Lambda 函数的输出格式部分:
在 Lambda 代理集成中,API Gateway 需要后端 Lambda 函数按照以下 JSON 格式返回输出
Run Code Online (Sandbox Code Playgroud)"isBase64Encoded": true|false, "statusCode": httpStatusCode, "headers": { "headerName": "headerValue", ... }, "multiValueHeaders": { "headerName": ["headerValue", "headerValue2", ...], ... }, "body": "..." }[...]
输出主体作为方法响应有效负载编组到前端 [...]
如果函数输出的格式不同,API Gateway 将返回502 Bad Gateway 错误响应。
回答奖金问题:
添加新的IAM角色并AmazonAPIGatewayPushToCloudWatchLogs在其摘要页面上获取其 ARN 后,我们可以按照以下步骤操作:
并看到服务器上的日志消息更具描述性:
Execution failed due to configuration error: Malformed Lambda proxy response
正如您上面所说,您必须对 Websocket 的所有消息进行字符串化才能发送回您的客户。
除此之外,在 websocket connect 方法上你不能return,因为你需要保持连接打开才能接收消息。您应该像这样调用在connect 方法上收到的回调
callback(null, {
statusCode: 200,
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4431 次 |
| 最近记录: |