调用 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 函数并增加时间限制。
所以我正在尝试使用 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 函数并增加时间限制。