我有一个要在设备上运行的 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');
})
任何想法都会有用。
我在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');
)? 你能在这里用小提琴重现这个问题吗?
是的...太糟糕了...我忘记添加命名空间服务器端并忘记在这里更新。 请忽略 :-/
最有用的评论
我正在使用 1.7.3 并且错误仍然存在。 降级到 1.4.8 有所帮助,但
emit
函数的工作方式似乎有所不同。 在 1.7.3 中修复此问题是否有任何进展?