Ошибка подключения 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()