Socket.io-client: Ошибка недопустимого пространства имен (только в Linux Ubuntu)

Созданный на 13 окт. 2016  ·  16Комментарии  ·  Источник: socketio/socket.io-client

У меня есть сценарий NodeJS, предназначенный для запуска на устройстве, и приложение на сервере. Я хочу подключить устройство к пространству имен /device на сервере. Это отлично работает в Windows. Однако в Ubuntu устройство просто никогда не подключается. Передача переменной env DEBUG в дает следующий результат:

socket.io-client:url parse http://localhost:3000/device +0ms
  socket.io-client new io instance for http://localhost:3000/device +7ms
  socket.io-client:manager readyState closed +5ms
  socket.io-client:manager opening http://localhost:3000/device +0ms
  engine.io-client:socket creating transport "websocket" +3ms
  engine.io-client:socket setting transport websocket +47ms
  socket.io-client:manager connect attempt will timeout after 20000 +2ms
  socket.io-client:manager readyState opening +4ms
  engine.io-client:socket socket receive: type "open", data "{"sid":"oYxMG7iQuy2Rp7LWAAAN","upgrades":[],"pingInterval":25000,"pingTimeout":60000}" +51ms
  engine.io-client:socket socket open +1ms
  socket.io-client:manager open +1ms
  socket.io-client:manager cleanup +1ms
  socket.io-client:socket transport is open - connecting +1ms
  socket.io-client:manager writing packet {"type":0,"query":"deviceId=123456789abcdef","nsp":"/device"} +1ms
  socket.io-parser encoding packet {"type":0,"query":"deviceId=123456789abcdef","nsp":"/device?deviceId=123456789abcdef"} +0ms
  socket.io-parser encoded {"type":0,"query":"deviceId=123456789abcdef","nsp":"/device?deviceId=123456789abcdef"} as 0/device?deviceId=123456789abcdef +1ms
  engine.io-client:socket flushing 1 packets in socket +1ms
  engine.io-client:socket socket receive: type "message", data "0" +14ms
  socket.io-parser decoded 0 as {"type":0,"nsp":"/"} +2ms
  engine.io-client:socket socket receive: type "message", data "4/device?deviceId=123456789abcdef,"Invalid namespace"" +3ms
  socket.io-parser decoded 4/device?deviceId=123456789abcdef,"Invalid namespace" as {"type":4,"nsp":"/device?deviceId=123456789abcdef","data":"Invalid namespace"} +2ms

Т.е. пространство имен кажется недействительным. Понятия не имею, почему, поскольку этот код отлично работает в Windows.
Код моего устройства (клиента):

const socket = io.connect('http://localhost:3000/device', {
    transports: ['websocket'],
    secure: true,
    query: { deviceId: '123456789abcdef' }
});

socket.on('connect', function() {
    console.log('Connection to server established');
})

Мой серверный код:

  const device = io.of('/device'),
      portal = io.of('/portal');

  device.on('connection', function(socket) {
      console.log('Connection made');
  })

Любые идеи были бы полезны.

Unable to reproduce

Самый полезный комментарий

Я использую 1.7.3, и ошибка все еще существует. Переход на 1.4.8 помог, но функция emit похоже, работает иначе. Есть ли прогресс в исправлении этого в 1.7.3?

Все 16 Комментарий

Я тоже это заметил в версии 1.5.0 socket.io-client . Похоже, что по какой-то причине значение opts.query добавляется к имени пространства имен, что вызывает ошибку «Недопустимое пространство имен».

пример:

io.connect("/hello", {
  query: "foo=bar"
})

Он должен подключиться к пространству имен /hello но вместо этого пытается подключиться к пространству имен /hello?foo=bar .

Я тестировал его в 1.4.8, и ошибок нет, поэтому ошибка появилась где-то после этого. (Также я не думаю, что эта ошибка связана конкретно с Ubuntu, потому что я могу воспроизвести ее на Win7 и Mint Rosa.)

О'кей, в этом есть смысл. Хм. Есть ли у вас какие-нибудь идеи по исправлению ситуации или где в репозитории мне следует искать, если я хочу это исправить?

Не знаю, как это исправить, но вы можете понизить версию до [email protected] где этой ошибки нет, я все равно так поступил.

Это может быть связано с https://github.com/socketio/socket.io-client/pull/943 (и https://github.com/socketio/socket.io/pull/2422)

Я тестировал его на v1.4.8, и он работал, как ожидалось. Затем я протестировал его с v1.5 только на клиенте, и он перестал работать. Однако установка v1.5 на сервер _и_ клиент устранила проблему.

Таким образом, похоже, что ошибка возникает только тогда, когда существует несоответствие версий между клиентом и сервером, но не тогда, когда у них обоих одна и та же версия, будь то выше или ниже v1.5.

@ Arrow7000, не могли бы вы проверить,

У меня все еще проблема с версией 1.7.2

@stgogm вы используете 1.7.2 и на клиенте, и на сервере? Это точно такая же проблема?

@darrachequesne Да, я. И ошибка та же: он пытается подключиться к /namespace?q=value , например, вместо подключения к /namespace и передать q в качестве параметра запроса.

@stgogm, не могли бы вы представить неудачный тестовый пример? Кажется, я не могу воспроизвести: https://github.com/darrachequesne/socket.io-fiddle/tree/issue/invalid-namespace

@darrachequesne По сути , ошибка исчезла. Возможно, серверная часть в то время не обновлялась. Приносим извинения за неверный отчет и благодарим за уделенное время!

У меня такая же проблема, когда она работает в версии клиента 1.4.8, но не работает в версии 1.5.1. (Я использую более старую версию сервера socket.io) Означает ли это, что клиентская и серверная версии socket.io всегда должны совпадать? Это где-то указано?

Я использую 1.7.3, и ошибка все еще существует. Переход на 1.4.8 помог, но функция emit похоже, работает иначе. Есть ли прогресс в исправлении этого в 1.7.3?

Просто наткнулся на что-то похожее на это ... но без строк запроса. Я просто звоню io([path]) w / path === "activities" .

У меня есть представление в моем приложении, которое устанавливает два сокета с именами, «/ посещений» и «/ действий» ... сокет «/ посещения» подключается нормально. Я вижу сообщение «Недопустимое пространство имен» при попытке подключиться к пространству имен «/ activity».

Не уверен, зачем он это делает. Я следую тому же шаблону для другого представления, в котором используются «/ homes» и «/ visit», и оба сокета прекрасно устанавливаются в этом представлении.

@RavenHursT правильно ли создано пространство имен activities ? (с io.of('/activities'); )? Не могли бы вы воспроизвести здесь проблему со скрипкой ?

Да ... мах, плохо ... Я забыл добавить серверное пространство имен и забыл обновить здесь. Пожалуйста, проигнорируй :-/

Была ли эта страница полезной?
0 / 5 - 0 рейтинги

Смежные вопросы

crazyyi picture crazyyi  ·  5Комментарии

zappfinger picture zappfinger  ·  5Комментарии

BorntraegerMarc picture BorntraegerMarc  ·  4Комментарии

Tiboonn picture Tiboonn  ·  6Комментарии

Sairyss picture Sairyss  ·  4Комментарии