Socket.io 1.3.7 игнорирует параметры

У меня есть скрипт node.js, который при подключении клиента читает и сбрасывает содержимое базы данных Mongo. Я только что обновился с 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); }
            });

Когда клиент подключается, он по-прежнему обновляется до подключения через веб-сокет, а не остается в качестве сеанса опроса. 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


person user3788685    schedule 06.12.2015    source источник


Ответы (1)


Проблема в том, что вы пытаетесь использовать options до того, как он будет фактически установлен. Сами переменные поддерживаются в JavaScript, а вот их назначения — нет. Это означает, что вы фактически передаете undefined (что, вероятно, вызывает загрузку значений по умолчанию) вместо вашего объекта options.

Решение состоит в том, чтобы установить options перед тем, как ссылаться на него. Например:

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

// ...
person mscdex    schedule 06.12.2015
comment
Ха! сорвано чем-то настолько простым, как это. Большое спасибо, только что протестировал и все работает :-) - person user3788685; 06.12.2015