У меня есть сценарий 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');
})
Любые идеи были бы полезны.
Я тоже это заметил в версии 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');
)? Не могли бы вы воспроизвести здесь проблему со скрипкой ?
Да ... мах, плохо ... Я забыл добавить серверное пространство имен и забыл обновить здесь. Пожалуйста, проигнорируй :-/
Самый полезный комментарий
Я использую 1.7.3, и ошибка все еще существует. Переход на 1.4.8 помог, но функция
emit
похоже, работает иначе. Есть ли прогресс в исправлении этого в 1.7.3?