Socket.io-client: 无效的命名空间错误(仅在 Linux Ubuntu 上)

创建于 2016-10-13  ·  16评论  ·  资料来源: socketio/socket.io-client

我有一个要在设备上运行的 NodeJS 脚本和一个服务器上的应用程序。 我想将设备连接到服务器上的/device命名空间。 这在 Windows 上非常有效。 然而,在 Ubuntu 上,设备永远不会连接。 传递一个 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条评论

我在socket.io-client 1.5.0 版中也注意到了这一点。 似乎由于某种原因, opts.query被附加到命名空间名称,这会导致“无效命名空间”错误。

例子:

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

它应该连接到命名空间/hello而是尝试连接到命名空间/hello?foo=bar

我在 1.4.8 中测试过,没有错误,所以此错误是在此之后的某个地方引入的。 (另外,我不认为这个错误与 Ubuntu 相关,因为我可以在 Win7 和 Mint Rosa 上重现它。)

啊好吧,这确实有道理。 嗯。 你有什么补救办法,或者如果我想解决这个问题,我应该在 repo 中的哪个地方寻找?

不知道如何解决这个问题,但你可以降级到[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.6.0 是否解决了您的问题?

我在 v1.7.2 仍然有这个问题

@stgogm您在客户端和服务器上都使用 1.7.2 吗? 这是完全相同的问题吗?

@darrachequesne是的,我是。 并且错误是相同的:例如,它尝试连接到/namespace?q=value ,而不是连接到/namespace并将q作为查询参数传递。

@stgogm你能提供一个失败的测试用例吗? 我似乎无法重现: https :

@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"

我的应用程序中有一个视图,它建立了两个命名空间套接字,“/visits”和“/activities”……“/visits”套接字连接得很好。 尝试连接到“/活动”命名空间时,我看到“无效命名空间”消息。

不知道为什么要这样做。 对于另一个使用“/homes”和“/visits”的视图,我遵循相同的模式,并且两个套接字都在该视图上建立得很好。

@RavenHursT是否正确创建了activities命名空间? (用io.of('/activities'); )? 你能在这里用小提琴重现这个问题吗?

是的...太糟糕了...我忘记添加命名空间服务器端并忘记在这里更新。 请忽略 :-/

此页面是否有帮助?
0 / 5 - 0 等级