无服务器 WebSocket 路由响应



我正在使用serverless来创建WebSocket服务,为此我能够使用serverless-offline在本地成功触发WebSocket路由。

我现在遇到的问题是响应这些 WS 事件。

我能够使用AWS.ApiGatewayManagementApi.postToConnection来响应我的本地 WebSocket 事件,尽管我似乎无法获取处理程序的return值来实际发送 WebSocket 事件作为响应,正如这些无服务器离线文档和这些 AWS 文档所建议的那样。

serverless.yml路线:

ws-custom:
handler: handler.wsCustom
events:
- websocket:
route: custom
routeResponseSelectionExpression: $default

处理程序:

module.exports.wsCustom = async (event) => {
const body = JSON.parse(event.body);
console.log('WebSocket `custom` event!', event);
return {
statusCode: 200,
body: JSON.stringify({ message: `Hello, ${body.name}!` }),
};
}

在我的浏览器 JavaScript 中调用该函数:

ws.send(JSON.stringify({ 'action': 'custom', 'name': 'kevbot' }));

结果是,我的serverless-offline日志(对于已部署的项目,则为 CloudWatch(将使用日志成功创建事件,但我的客户端不会收到任何事件作为响应。 有谁知道我如何使用处理程序的返回值来做到这一点?

编辑:

问题似乎存在于我的serverless-offline设置中。我将尝试让它在本地工作,并将创建一个必要的问题。

使用 WebSocket API 并尝试将集成中的响应返回到客户端时需要注意的重要一点,如本文档中所述:

对于配置为使用AWS_PROXYLAMBDA_PROXY集成的路由,通信是单向的,API Gateway 不会自动将后端响应传递到路由响应。例如,在LAMBDA_PROXY integration的情况下,Lambda 函数返回的主体将不会返回给客户端。如果希望客户端接收集成响应,则必须定义路由响应以使双向通信成为可能。

因此,如果您使用的是代理集成,则无法将响应返回给客户端。您必须使用 AWS。ApiGatewayManagementApi.postToConnection 方法,用于通信任何数据。

或者,如果您使用的是非代理集成,则可以为集成设置路由响应。

最新更新