Socket.IO не обновляет соединение с веб-сокетами

Я работаю над проектом с Angular и Node.js, где использую socket.io (v3.1.0). Проблема в том, что соединение между сервером и клиентом никогда не обновляется с опроса на веб-сокеты, хотя я вижу в веб-консоли, что запрос на обновление соединения отправляется и Получен код ответа 101 с переключением протоколов.

Вот код конфигурации socket.io на сервере:


const app = express();
const server = await app.listen(port);

const test = io.of('/api/test');
test.on('connect', socket => {
  console.log("Connected");
});


io.listen(server, 
      {
      cors: { 
         origin: "*", 
         methods: ["GET", "POST"],
         allowedHeaders: ["content-type"],
         credentials: true
      }
   });

Код клиента:

this.socket = io("/api/test")
this.socket.on('connect', () => {
      console.log("Connected");
});

Файл конфигурации прокси:

"/sock/*": {
        "target": "http://localhost:3000/socket.io/",
        "logLevel": "debug"
    }

Еще одна вещь, которую я хотел бы добавить, это то, что если я изменю прокси-файл на это:

"/sock/*": {
        "target": "http://localhost:3000/socket.io/",
        "logLevel": "debug",
        "ws": true
    }

Теперь в хроме работает только с ws (как и ожидалось), но не работает на мозилле (постоянно обновляет страницу и выдает ошибку).

Итак, вопрос: кто-нибудь знает, почему он не будет автоматически обновляться до веб-сокетов? Из того, что я понимаю, он должен сначала отправить http-запрос для рукопожатия, но после этого он должен обновиться до веб-сокетов по умолчанию, я ошибаюсь?


person Juen    schedule 02.02.2021    source источник


Ответы (1)


У меня такие же проблемы с Firefox. Если я настрою скрипт на получение пакета с сервера, socket.io отправит скрипт как text/html, что заставит Firefox не загружать его из-за заголовка X-Content-Type-Options: nosniff. И если я загружаю скрипт напрямую, он постоянно объединяется без возможности обновления.

person korrona    schedule 23.02.2021
comment
Позднее редактирование: теперь это работает. Вам нужно изменить порядок транспортов: socket = io({ query: { ['_csrf']: csrfToken }, transports: [ "websocket", "polling" ] }); - person korrona; 23.02.2021
comment
Я забыл, вам нужно установить скрипт из статического каталога или из cdn. Попытка загрузить его в виде пакета с сервера приведет к безерку Firefox с nosniff - person korrona; 23.02.2021
comment
о, спасибо за ответ, я только что увидел это!! :) - person Juen; 24.03.2021