这个问题常常是因为AWS的nodejs sdk没有正确的关闭websocket连接而导致的。可以通过以下代码解决:
const AWS = require('aws-sdk');
const apigatewaymanagementapi = new AWS.ApiGatewayManagementApi({
apiVersion: '2018-11-29',
endpoint: 'https://' + process.env.APIGATEWAY_WEBSOCKET_ENDPOINT + '/' + process.env.STAGE,
accessKeyId: process.env.AWS_ACCESS_KEY_ID,
secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY,
sessionToken: process.env.AWS_SESSION_TOKEN
});
class WebSocketClient {
static async sendMessage(connectionId, data) {
try {
await apigatewaymanagementapi.postToConnection({
ConnectionId: connectionId,
Data: data
}).promise();
} catch (error) {
if (error.statusCode === 410) {
console.warn(`Connection ${connectionId} is gone`);
} else {
console.error(`Failed to send message to ${connectionId}: `, error);
}
} finally {
// Cleanup
await apigatewaymanagementapi._cleanup()
}
}
}
apigatewaymanagementapi._cleanup = async function() {
return new Promise((resolve, reject) => {
if (this.ws && this.ws.terminate) {
this.ws.terminate();
}
this.ws = null;
resolve();
});
}
在你调用AWS.ApiGatewayManagementApi.postToConnection()
之后加上一句await apigatewaymanagementapi._cleanup(),用来关闭websocket连接。这样就能解决调用一次却执行两次的问题了。