无服务器WebSocket路由响应

时间:2020-06-07 02:03:20

标签: websocket aws-lambda aws-api-gateway serverless-framework

我正在使用serverless创建一个WebSocket服务,对于该服务,我可以使用serverless-offline和已部署的服务在本地成功触发我的WebSocket路由。

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

我能够使用AWS.ApiGatewayManagementApi.postToConnection来响应本地WebSocket事件,尽管我似乎无法获得处理程序的return值来实际发送WebSocket事件作为响应,例如{{3 }}和these serverless-offline docs建议。

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设置中存在。我将尝试使其在本地运行,并制造一个必要的问题。

1 个答案:

答案 0 :(得分:1)

使用doc中提到的使用WebSocket API并尝试将集成响应返回给客户端时要注意的重要一点:

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

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

或者,如果您使用的是非代理集成,则可以为集成设置route response