Почему соединение через веб-сокет завершается без установления соединения с экземпляром AWS даже при безопасном соединении?
Соединение через веб-сокет завершается без установления соединения с экземпляром AWS даже при безопасном соединении.
Работает отлично в моих локальных и промежуточных средах.
WebSocket connection to 'wss://api.domain.co:3004/socket.io/?token=eyJhbGciOiJSUzI1NiIsImtpZCI6IjY5N2Q3ZmI1ZGNkZThjZD....ZDtBXHGAXymsdupg9KC8hMkc63pc9A_SKxDRGloUC5qkA&EIO=4&transport=websocket' failed:
Error: websocket error
at s.value (transport.js:38:37)
at WebSocket.ws.onerror (websocket.js:80:37)
Код реакции:
useEffect(() => {
const token = localStorage.getItem('accessToken');
if (isInitialised && isAuthenticated && token && userUuid) {
const socket = socketIO(url, { query: { token }, transports: ['websocket'], secure: true });
socket.on("disconnect", (reason) => {
console.log(reason);
if (reason === "io server disconnect" || reason === "io client disconnect") {
// the disconnection was initiated by the server or client, you need to reconnect manually
socket.connect();
}
// else the socket will automatically try to reconnect
});
socket.on("connect_error", (e) => {
console.error(e);
});
socket.emit("registerForRapidStatus", userUuid);
socket.on("rapidIdStatus", (data) => {
setSocketData(data);
const { isVerified, rapidVerificationAttempts } = data;
updateUserProfile({ ...user, rapidIsVerified: isVerified, rapidVerificationAttempts });
});
return () => {
socket.off('rapidIdStatus');
socket.close();
};
}
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [isInitialised, isAuthenticated, userUuid]);
Экспресс-код NodeJs:
const server = http.createServer(app);
const socketIo = require("socket.io");
const io = socketIo(server, {
cors: { origins: [process.env.SOCKET_ORIGINS] }
});
io.on("connection", (socket) => {
listenToSocketEvent(socket)
console.log("Socket is connected.");
});
var socketsForRapid = new Map();
const inComingEvents = {
registerForRapidStatus: "registerForRapidStatus"
}
const listenToSocketEvent = (socket) => {
const eventNames = Object.values(inComingEvents);
eventNames.forEach((eventName) => {
socket.on(eventName, (data) => {
switch (eventName) {
case inComingEvents.registerForRapidStatus:
registerUserForRapidStatus(data, socket)
break;
}
});
})
}
const registerUserForRapidStatus = (userUuid, socket) => {
socketsForRapid.set(userUuid, socket)
}
URL-адрес подключения:
wss://api.domain.co:3004/socket.io/?token=eyJhbGciOiJSUzI1NiIsImtpZCI6IjY5N2Q....NMTGMsIMovjR5wcntAdQCO-eg184ZCSQ&EIO=4&transport=websocket
Соединение, которое работает на моем собственном хостинге, работает отлично:
ws://api.my-statging-server.com:3010/socket.io/?token=eyJhbGciOiJSUzI....QWkbtn_NWEmlJjQ&EIO=4&transport=websocket
Вы можете заметить, что я использую те же номера портов, на которых работает моя служба Node.
На AWS у меня есть экземпляр EC2 с ubuntu, где моя служба узла работает на 3004, порт разрешен, модуль Proxy_wstunnel включен.