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

Dan*_*zyk 9 javascript websocket node.js 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
});
Run Code Online (Sandbox Code Playgroud)

现在在我的前端,我连接到这些特定的命名空间,如此(再次,从示例中):

var admin_socket = io('/admin');
var user_socket = io('/user');
Run Code Online (Sandbox Code Playgroud)

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


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

io.on('connection', function(socket){
    //handle general conection
});
Run Code Online (Sandbox Code Playgroud)

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

var socket = io();
Run Code Online (Sandbox Code Playgroud)

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


或者,如果我仍然在我的后端使用命名空间,并且在前端我连接如下:

var admin_socket = io('localhost:3000/admin');
var user_socket = io(':3000/user');   //I can skip localhost
Run Code Online (Sandbox Code Playgroud)

一切都有效(事实上在firefox开发工具中我可以看到网络请求localhost:3000/).


为什么端口自动发现不能使用命名空间?有没有办法让它发挥作用?我在这里错过了什么吗?谢谢.


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

Dan*_*zyk 1

好的,我对 socket.io.js 中的代码进行了一些调试,并意识到那里存在潜在的错误。第 1050 行使用 loc.hostname 代替 loc.host。这会导致在传入命名空间时使用主机名,这不包括端口号。
如果没有使用命名空间,则使用第 1024 行 loc.host,一切正常。
我已经复制了该文件并将第 1050 行更改为使用主机,一切正常。
发现 github 问题,已在 1.4.x 中修复: https: //github.com/Automattic/socket.io-client/issues/812