Ошибка подключения Socket.io-client: ошибка веб-сокета

Раньше я получал вывод «ошибка опроса xhr» с кодом:

      import { io } from "socket.io-client";

const socket = io("https://socket.io/docs/v4", {
    reconnection: true,
    reconnectionDelay: 1000,
    reconnectionDelayMax: 5000,
    reconnectionAttempts: 3
});

socket.on('connect_error', function(error) {
    console.log(error.message);
});

После небольшого исследования это было «решено» путем добавления «транспортов: ['websocket']». Вот мой текущий код:

      import { io } from "socket.io-client";

const socket = io("https://socket.io/docs/v4", {
    reconnection: true,
    reconnectionDelay: 1000,
    reconnectionDelayMax: 5000,
    reconnectionAttempts: 3,
    transports: ['websocket']
});

socket.on('connect_error', function(error) {
    console.log(error.message);
});

К сожалению, это не решает мою проблему, потому что теперь я получаю следующий вывод: ошибка веб-сокета.

Другие вещи, которые я пробовал: указать порт после URL-адреса и установить для rejectUnauthorized значение false. (оба дают мне ту же ошибку веб-сокета.

Я немного в тупике, что делать дальше, и было бы приятно услышать отзывы некоторых из вас, ребята!

Версия Socket.io-клиента: 4.5.1

3 ответа

Это может быть проблема совместимости версий клиентских и серверных библиотек. У меня были похожие проблемы, и я смог решить их, добавив https://socket.io/docs/v4/server-options/#alloweio3 после просмотра https://socket.io/docs/v4/client-installation/ #версия-совместимость

Для тех, кто может столкнуться с этой проблемой в будущем (используя приложение expo React), я получал «ошибку веб-сокета», потому что мое приложение не могло связаться с моим экспресс-сервером по адресу http://localhost:3000, мне пришлось переключить «localhost» для моего локального компьютера. айпи.

(как получить свой -> https://www.avast.com/c-how-to-find-ip-address#:~:text=You%20can%20find%20your%20local,listed%20next%20to%20IPv4%20адрес.)

Все, что мне нужно было сделать на своем сервере, это добавить

      const httpServer = createServer(app);

httpServer.listen(PORT, 'your.local.ip', () => {
  console.log(`Server started on port ${PORT}`);
});

const io = new Server(httpServer, { cors: { origin: '*' } });

и в моем клиенте сделайте

      import { io } from 'socket.io-client';

export const socket = io('http://your.local.ip:3000', { transports: ['websocket'] });

socket.on('connect_error', (err) => {
  console.log(err.message);
});

Обратите внимание, что это решение только для локальной разработки, а не для производственной среды.

По умолчанию клиент попытается установить соединение WebSocket, если это возможно, и, если нет, вернется к длинному опросу HTTP, что объясняет, почему первое упомянутое вами изменение устранило ошибку опроса, но теперь у вас есть ошибка веб-сокета.

Если он пытается повторно подключиться автоматически, вам может потребоваться включить CORS или установить учетные данные. Если это не так, вам следует попробовать повторно подключиться вручную после тайм-аута с помощью socket.connect()

Другие вопросы по тегам