amazon-web-services - 在 $connect 路由中使用 apigwManagementApi.postToConnection 失败
问题描述
在客户端连接到 aws websocket 后,我想将 connectionId 返回给客户端。
我正在使用 apigwManagementApi.postToConnection 向客户端发送响应,但我总是收到一条荒谬的错误消息。
我已经尝试在谷歌中调试和搜索,但我找不到解决方案。
补丁.js
require('aws-sdk/lib/node_loader');
var AWS = require('aws-sdk/lib/core');
var Service = AWS.Service;
var apiLoader = AWS.apiLoader;
apiLoader.services['apigatewaymanagementapi'] = {};
AWS.ApiGatewayManagementApi = Service.defineService('apigatewaymanagementapi', ['2018-11-29']);
Object.defineProperty(apiLoader.services['apigatewaymanagementapi'], '2018-11-29', {
get: function get() {
var model = {
"metadata": {
"apiVersion": "2018-11-29",
"endpointPrefix": "execute-api",
"signingName": "execute-api",
"serviceFullName": "AmazonApiGatewayManagementApi",
"serviceId": "ApiGatewayManagementApi",
"protocol": "rest-json",
"jsonVersion": "1.1",
"uid": "apigatewaymanagementapi-2018-11-29",
"signatureVersion": "v4"
},
"operations": {
"PostToConnection": {
"http": {
"requestUri": "/@connections/{connectionId}",
"responseCode": 200
},
"input": {
"type": "structure",
"members": {
"Data": {
"type": "blob"
},
"ConnectionId": {
"location": "uri",
"locationName": "connectionId"
}
},
"required": [
"ConnectionId",
"Data"
],
"payload": "Data"
}
}
},
"shapes": {}
}
model.paginators = {
"pagination": {}
}
return model;
},
enumerable: true,
configurable: true
});
module.exports = AWS.ApiGatewayManagementApi;
index.js
const AWS = require('aws-sdk');
require('./patch.js');
exports.handler = async(event) => {
const connectionId = event.requestContext.connectionId;
const apigwManagementApi = new AWS.ApiGatewayManagementApi({
apiVersion: '2018-11-29',
endpoint: event.requestContext.domainName + '/' + event.requestContext.stage
});
await apigwManagementApi.postToConnection({ ConnectionId: connectionId, Data: connectionId }).promise();
return {};
};
客户端.js
const WebSocket = require('ws');
const ws = new WebSocket('wss://****');
ws.on('open', () => {
console.log('connected ===================>')
ws.on('message', data => console.warn(`From server: ${data}`));
});
CloudWatch 中的错误
{
"errorMessage": "410",
"errorType": "UnknownError",
"stackTrace": [
"Object.extractError (/var/runtime/node_modules/aws-sdk/lib/protocol/json.js:48:27)",
"Request.extractError (/var/runtime/node_modules/aws-sdk/lib/protocol/rest_json.js:52:8)",
"Request.callListeners (/var/runtime/node_modules/aws-sdk/lib/sequential_executor.js:105:20)",
"Request.emit (/var/runtime/node_modules/aws-sdk/lib/sequential_executor.js:77:10)",
"Request.emit (/var/runtime/node_modules/aws-sdk/lib/request.js:683:14)",
"Request.transition (/var/runtime/node_modules/aws-sdk/lib/request.js:22:10)",
"AcceptorStateMachine.runTo (/var/runtime/node_modules/aws-sdk/lib/state_machine.js:14:12)",
"/var/runtime/node_modules/aws-sdk/lib/state_machine.js:26:10",
"Request.<anonymous> (/var/runtime/node_modules/aws-sdk/lib/request.js:38:9)",
"Request.<anonymous> (/var/runtime/node_modules/aws-sdk/lib/request.js:685:12)"
]
}
我不知道为什么,但是如果我尝试自定义路线,则此代码可以工作。有谁知道如何解决这个问题?
解决方案
我建议从 AWS 中查看这个示例,有用于子协议确认的连接响应,但我认为可以提供任何有效负载。最重要的一点是模板中的路由集成设置,基本上就是路由集成属性中的以下两行:
IntegrationMethod: POST
ConnectionType: INTERNET
然后响应将被发送到连接的客户端。
推荐阅读
- mysql - 过滤掉具有相同列的行
- docker - Dockerfile - 找不到满足 serverlessrepo==0.1.5 要求的版本
- google-apps-script - 如何以编程方式从 Google 表格数据透视表中删除“值”
- azure-databricks - 我需要一个 azure_databricks 作业因异常而失败,但它没有这样做
- .net - 如何检查是否在与 xUnit(.net 核心)的集成测试中引发异常?
- python - 计数核苷酸脚本(填补空白)
- diff - Diff/Merge 工具,它也允许编辑文件
- symfony - 下拉菜单中的默认值
- c# - 带有 Prism 库的 Xamarin.Forms 应用程序中的多个 NavigationStack
- javascript - 浏览器 Javascript:将 Json 压缩为 gzip 并上传到 S3 预签名 URL