Socket.io 使用命名空间时客户端忽略端口 [错误?]
Socket.io client ignoring port when namespace used [Bug?]
我有一个简单的 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 开发工具中我可以看到网络请求进入 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 中的代码进行了一些调试,并意识到那里存在潜在的错误。在第 1050 行,使用了 loc.hostname 而不是 loc.host。
这会导致在传入命名空间时使用主机名,这不包括端口号。
在没有使用命名空间的情况下,第 1024 行 loc.host 被使用,一切正常。
我复制了一份文件并将第 1050 行更改为使用主机,一切正常。
发现 github 问题,已在 1.4.x 中修复:
https://github.com/Automattic/socket.io-client/issues/812
我有一个简单的 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 开发工具中我可以看到网络请求进入 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 中的代码进行了一些调试,并意识到那里存在潜在的错误。在第 1050 行,使用了 loc.hostname 而不是 loc.host。
这会导致在传入命名空间时使用主机名,这不包括端口号。
在没有使用命名空间的情况下,第 1024 行 loc.host 被使用,一切正常。
我复制了一份文件并将第 1050 行更改为使用主机,一切正常。
发现 github 问题,已在 1.4.x 中修复:
https://github.com/Automattic/socket.io-client/issues/812