【问题标题】:AWS API Gateway Web Socket Api - broadcast message to all connected clientsAWS API Gateway Websocket Api - 向所有连接的客户端广播消息
【发布时间】:2019-09-20 13:09:13
【问题描述】:

我已经使用 API Gateway 创建了一个 Web Socket Api,并且能够将客户端连接到它。

另外,我可以通过指定ConnectionId 并使用以下代码向连接的客户端发送消息:

const AWS = require('aws-sdk');
let apiGatewayManagementApi = new AWS.ApiGatewayManagementApi({
  apiVersion: '2018-11-29',
  endpoint: 'https://XXXXXXXXX.execute-api.sa-east-1.amazonaws.com/dev/',
  region: 'sa-east-1'
});
const params = {
  ConnectionId: 'YYYYYYYYYYYYY',
  Data: 'test'
};
apiGatewayManagementApi.postToConnection(params, function (err, data) {
  if (err) {
    console.log(err, err.stack); // an error occurred
  } else {
    console.log(data);           // successful response
  }
});

问题是我不需要区分客户端,因此我不想跟踪每个客户端的 ConnectionId,但如果我在发送消息时将其删除,我会收到以下错误: Missing required key 'ConnectionId' in params

有没有办法向所有连接的客户端发送消息(不指定任何 ConnectionId)?

【问题讨论】:

  • 不可能,我想是的!您需要获取所有连接 ID,然后使用循环向所有客户端发送消息。

标签: javascript websocket aws-lambda aws-sdk aws-api-gateway


【解决方案1】:

很遗憾,you have to specify the ConnectionId。我见过的一种模式是在$connect 事件上将连接信息持久化到 DynamoDB;那么你可以这样做:

const connections = await getAllConnections();
const promises = connections.map(c => apiGwMgmtApi.postToConnection({ ConnectionId: c.connectionId, Data: 'test' }).promise());
await Promise.all(promises);

【讨论】:

  • 感谢您的回答!我在许多示例中都看到了这种模式,但仍然希望有一种方法可以在不跟踪单个 ID 的情况下做到这一点。
猜你喜欢
  • 1970-01-01
  • 2019-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-02
  • 1970-01-01
  • 2013-04-25
  • 2018-11-14
相关资源
最近更新 更多