Socket.io 1.3.7 忽略选项

Posted

技术标签:

【中文标题】Socket.io 1.3.7 忽略选项【英文标题】:Socket.io 1.3.7 ignoring options 【发布时间】:2016-03-10 20:29:59 【问题描述】:

我有一个 node.js 脚本,当客户端连接时,它会读取并转储 Mongo DB 的内容。我刚刚从 socket.io 0.9 升级,缺乏示例和可怜的 docs 让我有些困惑。

我以前可以使用io.set('transports', ['xhr-polling']) 设置选项,但是这个已经被删除了,我可以找出定义选项的新方法是这样的

        
        allowUpgrades: false,
        transports: [ 'polling' ],
        pingTimeout: 5000,
        pingInterval: 2500
        ;

但是...它们似乎被忽略了。

这是完整的 node.js 脚本;

var io = require('socket.io')(8002, options);
cp = require('child_process');
var tail = cp.spawn('test-scripts/k-test.rb');
    var options = 
        allowUpgrades: false,
        transports: [ 'polling' ],
        pingTimeout: 5000,
        pingInterval: 2500
        ;

    //On connection do the code below//
    io.on('connection', function (socket) 
        console.log();


        //Read the state list from db//
        var connection_string = '127.0.0.1:27017/test';
        var mongojs = require('mongojs');
        var db = mongojs(connection_string, ['k1']);
        var k1 = db.collection('k1');
        db.k1.find(, '_id': 0, "data.time":0).forEach(function(err, doc) 
            if (err) throw err;
            if (doc)  io.emit('k1', doc); 
            );

当客户端连接时,它仍会升级为 Web 套接字连接,而不是保持为轮询会话。 pingTimeout & pingInterval 不起作用 - 如果我从移动客户端连接,从关闭浏览器到服务器说客户端超时至少需要 1 分钟。

谁能指出我在哪里出错了。如果有帮助,我可以提供旧 (0.9) 代码。

更新: 用下面@mscdex 的答案修复。对其他人有用的说明 - 如果您启用了调试,那么在启动时读取选项时,您应该得到这样的输出; socket.io:server creating engine.io instance with opts "allowUpgrades":false,"transports":["polling"],"pingTimeout":10000,"pingInterval":5000,"path":"/socket.io" +9ms

【问题讨论】:

【参考方案1】:

问题是您在实际设置之前尝试使用options。变量本身 javascript 中被提升,但它们的赋值不是这样。这意味着您实际上是在传递 undefined(这可能会导致加载默认值)而不是您的 options 对象。

解决方案是在引用之前设置options。例如:

var options = 
    allowUpgrades: false,
    transports: [ 'polling' ],
    pingTimeout: 5000,
    pingInterval: 2500
;
var io = require('socket.io')(8002, options);

// ...

【讨论】:

哈!被这么简单的事情挫败了。非常感谢您刚刚测试过并且可以正常工作:-)

以上是关于Socket.io 1.3.7 忽略选项的主要内容,如果未能解决你的问题,请参考以下文章

socket.io客户端API

Socket.IO 入门

更改 Socket.IO 静态文件服务路径

Socket.io 延伸

节点 js 错误:找不到模块 './lib/socket.io'

socket.io:为啥这个广播语句不起作用?