无服务器WebSocket路由响应

问题描述 投票:0回答:1

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

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

我能够使用AWS.ApiGatewayManagementApi.postToConnection响应我的本地WebSocket事件,尽管我似乎无法获得我的处理程序的return值来实际发送WebSocket事件作为响应,如these serverless-offline docsthese AWS 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设置中存在。我将尝试使其在本地运行,并会产生必要的问题。

websocket aws-lambda aws-api-gateway serverless-framework
1个回答
0
投票

[使用WebSocket API并尝试将集成响应返回给客户端时要注意的重点,如本doc中所述:

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.