调用ApiGatewayManagementApi.postToConnection()给我500个内部服务器错误?

时间:2019-02-21 08:13:30

标签: aws-lambda aws-sdk

所以我正在尝试使用lambda开发aws websocket函数。但是似乎每当我尝试调用“ postToConnection”时,它只会给我500个内部服务器错误。

Cloud watch也不会记录我收到的错误。

发送消息后,我在终端上收到的内容是:

"{"message": "Internal server error", "connectionId":"xxx", "requestId":"xxx"}"

(根本不给我任何信息)

这是我关于lambda函数的全部代码。

var AWS = require('aws-sdk');
AWS.config.update({ region: "us-west-2" });
var DDB = new AWS.DynamoDB({ apiVersion: "2012-10-08" });

require('aws-sdk/clients/apigatewaymanagementapi');

exports.handler = function (event, context, callback) {
  var url_handler = event.requestContext.domainName + "/" + event.requestContext.stage;
  // var params = event.requestContext;
  // console.log(params);


  var scanParams = {
    TableName: "tbl-web-socket-connection",
    ProjectionExpression: "id"
  };


  DDB.scan(scanParams, function (err, data) {
      // callback(null, {
      //   statusCode: 200,
      //   body: "Data send to"
      // });
    if (err) {
      callback(null, {
        statusCode: 500,
        body: JSON.stringify(err)
      });
    } else {
      var apigwManagementApi = new AWS.ApiGatewayManagementApi({
        apiVersion: "2018-11-29",
        endpoint: event.requestContext.domainName + "/" + event.requestContext.stage
      });

      var postParams = { 
        Data: JSON.parse(event.body).data
      };
      var count = 0;

      data.Items.forEach(function (element) {
        postParams.ConnectionId = element.id.S;
          console.log(postParams);

          apigwManagementApi.postToConnection(postParams, function (err, data) {

            if (err) {
              // API Gateway returns a status of 410 GONE when the connection is no
              // longer available. If this happens, we simply delete the identifier
              // from our DynamoDB table.

              if (err.statusCode === 410) {
                console.log("Found stale connection, deleting " + postParams.connectionId);
                DDB.deleteItem({ TableName: process.env.TABLE_NAME,
                                Key: { connectionId: { S: postParams.connectionId } } });
              } else {
                console.log("Failed to post. Error: " + JSON.stringify(err));
              }
            } else {
              count++;
            }
          });

      });

      callback(null, {
        statusCode: 200,
        body: "Data send to " + count + " connection" + (count === 1 ? "" : "s")
      });
    }
  });
};

aws-sdk也已更新,我在lambda层上声明了它,这就是我正在使用的。

你知道是什么原因造成的吗?

1 个答案:

答案 0 :(得分:0)

这是由于超时导致的,dynamodb遍历了所有导致超时的记录。

cloudwatch似乎确实记录了该错误,但是我太关注终端错误了,这给了我500(内部服务器错误)。

要解决此问题,只需转到lambda函数并增加时间限制。