我正在使用serverless
创建一个WebSocket服务,对于该WebSocket服务,我可以使用serverless-offline
和已部署的服务在本地成功触发我的WebSocket路由。
我现在遇到的问题是响应那些WS事件。
我能够使用AWS.ApiGatewayManagementApi.postToConnection
响应我的本地WebSocket事件,尽管我似乎无法获得我的处理程序的return
值来实际发送WebSocket事件作为响应,如these serverless-offline docs和these 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 API并尝试将集成响应返回给客户端时要注意的重点,如本doc中所述:
对于配置为使用
AWS_PROXY
或LAMBDA_PROXY
集成的路由,通信是单向的,并且API Gateway不会将后端响应自动传递给路由响应。例如,在LAMBDA_PROXY integration
的情况下,Lambda函数返回的主体将不会返回给客户端。如果希望客户端接收集成响应,则必须定义路由响应以使双向通信成为可能。
因此,如果您正在使用代理集成,则无法将响应返回给客户端。您将必须使用AWS.ApiGatewayManagementApi.postToConnection方法来传递任何数据。
或者,如果您使用的是非代理集成,则可以为集成设置route response。