Я использую Angular 4, Express 4.16.3 и Socket.IO 2.1.1 , чтобы создать движок чата для панели администратора поддержки , где Команда поддержки, использующая панель администратора, может общаться с клиентами на веб-сайте, для которого я использую один сервер на стороне панели администратора и 2 клиента , где один клиент снова находится на панели администратора для группы поддержки и Другое на стороне сайта для клиентов.
У меня есть два субдомена (один для панели и один для веб-сайта), и я обращаюсь к этому ответу , так как мне нужно решение для междоменного соединения в socket.io
Сервер находится на adminpanel.azurewebsites.net
Мои два клиента развернуты на обоих поддоменах:
Клиент веб-сайта на website.azurewebsites.net и
Панель (поддержка) клиента на adminpanel.azurewebsites.net
Я также включил CORS на adminpanel.azurewebsites.net (заголовок Access-Control-Allow-Origin установлен на *) и включил веб-сокеты на портале Azure. Оба моих приложения https.
Серверная часть (панель администратора) выглядит следующим образом :
port = process.env.PORT || 1337;
var server = require('http').Server(app);
var io = require('socket.io')(server ,{
transports: ['websocket']
});
io.on('connection', function(socket) {
socket.emit('socket connected')
//every time a new customer added on website end, new room is created
socket.on('new customer added', function(username) {
socket.broadcast.emit('new room', username)
})
});
server.listen(port);
Клиентская часть (панель администратора) выглядит следующим образом :
this.socketUrl = 'adminpanel.azurewebsites.net'
this.sockets['main'] = io.connect(this.socketUrl, {
transports: ['websocket']
});
this.sockets['main'].on('new room', (room) => {
this.sockets[room] = io.connect(this.socketUrl+'?token=' + room, {
transports: ['websocket']
});
});
На стороне клиента панели создается комната для каждого нового клиента.
Клиентская сторона (веб-сайт) выглядит следующим образом :
this.socket = io.connect('adminpanel.azurewebsites.net?token=' + this.username, {
transports: ['websocket']
});
this.socket.emit('new customer added', this.username);
Теперь проблема в том, что это прекрасно работает на локальном хосте, но на производстве, предупреждение
Соединение WebSocket с 'wss: //adminpanel.azurewebsites.net/socket.io/? Token = Test% 20Name & EIO = 3 & transport = websocket' не удалось: WebSocket закрывается до установления соединения.
отображается как на стороне панели администратора, так и на стороне сайта, после чего чат перестает работать.
Это предупреждение появляется несколько раз, затем отображается следующая ошибка:
enter code here
Соединение WebSocket с 'wss: //adminpanel.azurewebsites.net/socket.io/? Token = Проверка% 20Name & EIO = 3 & transport = websocket' завершилась неудачно: истекло время ожидания открытия WebSocket
После отладки вот что я получил:
engine.io-client:socket socket error {"type":"TransportError","description":{"isTrusted":true}} +4ms
socket.io-client:manager connect_error +8ms
socket.io-client:manager cleanup +4ms
socket.io-client:manager reconnect attempt error +5ms
socket.io-client:manager will wait 2154ms before reconnect attempt +3ms
engine.io-client:socket socket close with reason: "transport error" +19ms
engine.io-client:socket socket closing - telling transport to close +3ms
socket.io-client:manager attempting reconnect +2s
socket.io-client:manager readyState closed +2ms
socket.io-client:manager opening https://adminpanel.azurewebsites.net?token=Test Name +3ms
engine.io-client:socket creating transport "websocket" +2s
engine.io-client:socket setting transport websocket +3ms
socket.io-client:manager connect attempt will timeout after 20000 +10ms
socket.io-client:manager connect attempt timed out after 20000 +20s
engine.io-client:socket socket close with reason: "forced close" +20s
Так что приложения некоторое время работают нормально, но появляется это предупреждение, и приложение перестает работать.
Я не могу понять, что является причиной этой ошибки и как я могу остановить ее возникновение. Есть ли способ обойти эту проблему?