Socket.io客户端在使用命名空间时忽略端口

我有一个简单的node.js应用程序与socket.io(1.3.5),取自socket.io示例:

// Setup basic express server var express = require('express'); var app = express(); var server = require('http').createServer(app); var io = require('socket.io')(server); var port = process.env.PORT || 3000; server.listen(port, function () { console.log('Server listening at port %d', port); }); // Routing app.use(express.static(__dirname + '/public')); io.of('/admin').on('connection', function(socket){ //handle conection on /admin namespace }); io.of('/user').on('connection', function(socket){ //handle conection on /user namespace }); 

现在在我的前端,我连接到这些特定的命名空间,就像这样(再次,从例子中):

 var admin_socket = io('/admin'); var user_socket = io('/user'); 

该应用程序在端口3000上运行,并使用URL localhost:3000打开网站。
当我这样做,我得到CORS错误,似乎像客户端的Socket.io不开始自动检测端口号一开始使用命名空间(在Firefox开发工具,我可以看到请求去localhost/而不是localhost:3000/ )。


如果在我的服务器端,我不使用名称空间:

 io.on('connection', function(socket){ //handle general conection }); 

而在前端我用这种方式连接:

 var socket = io(); 

一切工作正常,端口自动发现工作,并在Firefox开发工具,我可以看到连接到localhost:3000/


另外,如果我仍然在我的后端使用命名空间,并在前端连接像这样:

 var admin_socket = io('localhost:3000/admin'); var user_socket = io(':3000/user'); //I can skip localhost 

再次一切正常(实际上在Firefox开发工具,我可以看到networking请求去localhost:3000/ )。


端口自动发现如何不能使用名称空间? 有没有办法让它起作用? 我在这里错过了什么? 谢谢。


看到我的答案下面的修复…

没有必要乱搞港口,它应该只是通过工作

 var admin_socket = io('/admin'); var user_socket = io('/user'); 

我不认为有没有办法让自动端口发现工作,而不修改实际的Socket.io代码或等待修复。 你可以做的最简单的事情就是在你的名字空间之前插入包含冒号的当前location.port .port。

 var admin_socket = io(':' + location.port + '/admin'); var user_socket = io(':' + location.port + '/user'); 

或者创build一个新的函数来为你创build一个套接字。

 function sio(nsp) { return io(':' + location.port + nsp); } 

好的,我在socket.io.js中进行了一些代码的debugging,并意识到这里有一个潜在的错误。 在1050行使用loc.hostname而不是loc.host。 这会导致在传入命名空间时使用主机名,这不包括端口号。
如果没有命名空间正在使用,在线1024 loc.host正在使用,一切都很好。
我已经采取了该文件的副本,并改变线1050使用主机,一切工作正常。
发现github的问题,它在1.4.x中修复: https : //github.com/Automattic/socket.io-client/issues/812