Javascript Socket.io客户端在使用命名空间时忽略端口[Bug?]

Javascript Socket.io客户端在使用命名空间时忽略端口[Bug?],javascript,node.js,websocket,socket.io,Javascript,Node.js,Websocket,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.

我有一个简单的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
});
现在,在我的前端,我像这样连接到这些特定的名称空间(同样,取自示例):

应用程序正在端口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开发工具中,我可以看到网络请求转到
localhost:3000/


为什么端口自动发现不适用于名称空间?有办法让它工作吗?我是不是遗漏了什么?谢谢



请参阅下面我的答案以获得修复…

无需弄乱端口,它几乎可以在

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

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

var admin_socket = io(':' + location.port + '/admin');
var user_socket = io(':' + location.port + '/user');
或者创建一个新函数来为您创建套接字

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

好的,我对socket.io.js中的代码进行了一些调试,发现其中存在一个潜在的bug。第1050行使用loc.hostname代替loc.host。 这会导致在传入命名空间时使用主机名,但不包括端口号。
如果没有使用名称空间,则使用第1024行的loc.host,一切正常。
我已复制了该文件,并将第1050行更改为使用主机,一切正常。
发现github的问题,在1.4.x中已修复:

这个bug真的很烦人,在任何旧版本的socket.io中都没有。谢谢你的修复!Bug仍然存在于1.3.6中,它占用了我一天的时间。非常感谢这篇关于修复的文章-我发现它在默认名称空间中工作时遇到了问题。你能把你的答案从问题中转移到答案中吗?
function sio(nsp) {
    return io(':' + location.port + nsp);
}