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

calling ApiGatewayManagementApi.postToConnection() gives me 500 internal server error?

所以我正在尝试使用 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 层上声明了它,这就是我正在使用的。

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

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

看起来 cloudwatch 确实在记录错误,但我太专注于终端错误,它给了我 500,内部服务器错误。

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