amazon-web-services - 在 $connect 路由中使用 apigwManagementApi.postToConnection 失败

标签 amazon-web-services websocket aws-lambda aws-api-gateway

在客户端连接到 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)"
    ]
}

我不知道为什么,但是如果我尝试自定义路线,则此代码可以工作。
有谁知道如何解决这个问题?

最佳答案

我建议查看 this来自 AWS 的示例,有用于子协议(protocol)确认的连接响应,但我认为可以提供任何有效负载。
最重要的一点是模板中的路由集成设置,基本上就是路由集成属性中的以下两行:

  IntegrationMethod: POST
  ConnectionType: INTERNET
然后响应将被发送到连接的客户端。

关于amazon-web-services - 在 $connect 路由中使用 apigwManagementApi.postToConnection 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55686504/

相关文章:

javascript - 使用 JS/jQuery 触发 React onChange 事件

amazon-web-services - 手动触发 Amazon S3 库存报告

amazon-web-services - AWS lambda 音频特征提取(存储层数不足)

python - 尝试在输出中返回多个值

javascript - 支持 ssl 的 Websocket 服务器(使用 websocket.io)

powershell - 如何使用 Powershell System.Net.WebClient 和自定义用户代理字符串保存 "browser-initiated download"文件?

javascript - 如何修复 Node.JS 和 Socket.io 中玩家定位关闭的问题

amazon-web-services - 具有ID的API不包含路径/*的资源,该资源的ANY方法具有集成LAMBDA

wordpress - 无法将AWS Elastic Beanstalk与Docker一起使用来部署Wordpress

amazon-web-services - 代码部署失败,没有任何错误消息