Javascript Socket.io客户端在使用命名空间时忽略端口[Bug?]
我有一个简单的node.js应用程序,其中包含socket.io(1.3.5),摘自socket.io示例: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.
// 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上运行,网站是使用URLlocalhost: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);
}