javascript - 无服务器 WebSockets - 没有找到与 http 方法 POST 的路由 @connections/* 匹配的方法
问题描述
我正在使用无服务器框架来托管我的 WebSocket,它具有更新我的连接数据库的典型 $connect、$disconnect、$default 等方法:
case '$connect':
await dynamoDb.put({
TableName: process.env.CONNECTIONS_TABLE,
Item: {
connectionId,
// Expire the connection an hour later. This is optional, but recommended.
// You will have to decide how often to time out and/or refresh the ttl.
ttl: parseInt((Date.now() / 1000) + 3600)
}
}).promise();
我的 WebSocket 设置是:
WebSocket URL: wss://1111111111.execute-api.ap-southeast-2.amazonaws.com/dev/
Connection URL: https://1111111111.execute-api.ap-southeast-2.amazonaws.com/dev/@connections
我的 HTTP 设置是:
Invoke API at: https://222222222.execute-api.ap-southeast-2.amazonaws.com/dev/
我有一个广播函数,我用它来向连接发送数据,我正在调用它:
sls invoke --function broadcast --data '{ \"body\": \"Hello from server\" }'
源向每个连接发送一条消息,如请求的参数中所提供:
async function sendMessage(connectionId, body) {
try {
await apig.postToConnection({
ConnectionId: connectionId,
Data: body
}).promise();
} catch (err) {
// Ignore if connection no longer exists
if(err.statusCode !== 400 && err.statusCode !== 410) {
throw err;
}
}
}
async function getAllConnections(ExclusiveStartKey) {
const { Items, LastEvaluatedKey } = await dynamoDb.scan({
TableName: process.env.CONNECTIONS_TABLE,
AttributesToGet: [ 'connectionId' ],
ExclusiveStartKey
}).promise();
const connections = Items.map(({ connectionId }) => connectionId);
if(LastEvaluatedKey) {
connections.push(...await getAllConnections(LastEvaluatedKey));
}
return connections;
}
module.exports.handler = async function(event, context) {
const { body } = event;
const connections = await getAllConnections();
await Promise.all(
connections.map(connectionId => sendMessage(connectionId, body))
);
}
可以建立连接(我可以连接到 WebSocket),但是当我尝试调用此函数时,我收到错误:
没有找到与 http 方法 POST 的路由 @connections/ZE4SDfSJSwMCJ4g%3D 匹配的方法。
这ZE4SDfSJSwMCJ4g
是我的connectionId,它存在于我的数据库中。我不确定这个路由问题是否与我的 HTTP API 和我的 WebSocket API 指向不同的 API Gateway URL 有关?
感谢您的帮助!
解决方案
确保 API Gateway 管理配置中的端点与 ws 端点相同。
const agma = new AWS.ApiGatewayManagementApi({
apiVersion: AGMA_VERSION,
endpoint: WS_ENDPOINT // 1111111111.execute-api.ap-southeast-2.amazonaws.com/dev
})
推荐阅读
- docker - docker supervisord cron 工作不工作
- python - Pandas DataFrame,1、2、3 和 NaN 值的默认数据类型
- c# - 如何在 Unity 中 EncodeToPng 压缩纹理
- python - “字符串索引超出范围”Python 错误
- python - 更新 matplotlib 散点图数据
- apache-spark - Apache Spark:运行命令从 HDFS 读取文件时出错
- python - 根据指定列对其他列进行排序
- python - Python Pivot 丢失最后一列
- google-cloud-platform - 在 BigQuery 上插入行:InsertAllRequest 与 BigQueryIO.writeTableRows()
- excel - 根据另一张纸上的顺序 # 从一张纸中查找列值