我正在使用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_PROXY
或LAMBDA_PROXY
集成的路由,通信是单向的,API Gateway 不会自动将后端响应传递到路由响应。例如,在LAMBDA_PROXY integration
的情况下,Lambda 函数返回的主体将不会返回给客户端。如果希望客户端接收集成响应,则必须定义路由响应以使双向通信成为可能。
因此,如果您使用的是代理集成,则无法将响应返回给客户端。您必须使用 AWS。ApiGatewayManagementApi.postToConnection 方法,用于通信任何数据。
或者,如果您使用的是非代理集成,则可以为集成设置路由响应。