【问题标题】:Socket.io client ignoring port when namespace used [Bug?]使用命名空间时 Socket.io 客户端忽略端口 [错误?]
【发布时间】:2015-05-31 04:24:39
【问题描述】:

我有一个带有 socket.io (1.3.5) 的简单 node.js 应用程序,取自 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/ 而不是 @ 987654325@)。


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

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/)。


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


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

【问题讨论】:

  • 这个 bug 真的很烦人,在任何旧版本的 socket.io 中都没有。感谢您的修复!
  • 1.3.6 中仍然存在的错误,它占用了我一天的时间。非常感谢这篇带有修复的文章 - 我发现它在默认命名空间中工作时停滞不前。
  • 你能把你的answerquestion移到answer中吗?

标签: javascript node.js websocket socket.io


【解决方案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

【讨论】:

    【解决方案2】:

    如果不修改实际的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);
    }
    

    【讨论】:

      【解决方案3】:

      不需要弄乱端口,它几乎应该可以工作

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-03-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-23
        相关资源
        最近更新 更多