2016-02-01 3 views
2

У меня возникла спорадическая проблема с моим сервером Node/loopback. Моя настройка такова:Ошибка Node.js sporadic «ECONNREFUSED» на request.get

EDIT: Моя версия узла v4.2.4, я запускаю узел в Windows 10 Professional.

стороне клиента:

  • nw.js клиент, который проходит через локальную файловую систему и вычисляет значение MD5 файлов.

  • Использование request.post, клиент посылает хэш файла на сервер в формате 'fileHash: d41d8cd98f00b204e9800998ecf8427e' (это просто пример, хэш, я знаю, что это пустой файл)

    function checkHash (fileHash){ 
    request.post({ 
        headers: {'content-type' : 'application/x-www-form-urlencoded'}, 
        url: 'http://localhost:3000/api/checkBoths/hashcheck', 
        method: 'POST', 
        form: { 
         fileHash: fileHash 
        } 
    }, function(error, response, body){ 
        if(error) { 
        console.log(error); 
        } else { 
        console.log(response.statusCode, body); 
        } 
    }); 
    
    } 
    

сервера сторона:

  • сервер/петлевой узел работает на localhost:3000.

  • Функция hashCheck предназначена для считывания данных, отправленных клиентом, и запроса базы данных MySQL, которая соответствует совпадению хэша.

  • Ответ от сервера будет в формате goodResult : true, если хэш существует в базе данных или goodResult : false, если нет.

    var request = require('request'); 
    
    module.exports = function (CheckBoth) { 
    
    var goodResult; 
    
    CheckBoth.hashCheck = function (fileHash, cb) { 
    
    requestGood(fileHash); 
    
        function requestGood (fileHash) { 
    
    request.get('http://127.0.0.1:3000/api/Goodhashes/' + fileHash + '/exists', function (error, response, body) { 
        if (!error && response.statusCode == 200) { 
        goodResult = JSON.parse(body).exists; 
        } 
        if (error) { 
        console.error(error); 
        } 
    }); 
    console.log(goodResult); 
        } 
    
    cb(goodResult); 
    }; 
    
    
    CheckBoth.remoteMethod(
    'hashCheck', 
    { 
        accepts: {arg: 'fileHash', type: 'string'}, 
        returns: [{arg: 'goodResult', type: 'string'}] 
    } 
    ); 
    }; 
    

Выпуск:

Сервер может ответить ~ 1000 запросов до следующих появляется в ответах:

{ [Error: connect ECONNREFUSED 127.0.0.1:3000] 
    code: 'ECONNREFUSED', 
    errno: 'ECONNREFUSED', 
    syscall: 'connect', 
    address: '127.0.0.1', 
    port: 3000 } 

Я попытался положить в различных обратных вызовов в пределах код сервера, но это не имеет никакого значения. Я думаю, что я, вероятно, должен задушить запросы на сервер, но я не знаю, как этого добиться.

Любая помощь была бы принята с благодарностью.

+0

В какой версии узла вы работаете? – migg

+0

@migg Я бегу v4.2.4 – Oddball

+0

Хмм ...ваш параметр называется 'callback', но вы вызываете' cb'. Может быть, вы создаете memleak, пока сервер не откажется от соединений? – migg

ответ

1

Значение по умолчанию для большинства систем - 1024. См. Руководство по limits.conf (http://linux.die.net/man/5/limits.conf).

В то время как @migg правильна, чтобы обеспечить отсутствие утечек памяти в вашем приложении, а обработка процесса с его настройкой для высоких нагрузок также является обычной процедурой для довольно многих приложений.

Попробуйте это и посмотрите, поможет ли это;

$ ULIMIT -n 65535

Edit: Я не проверял это, но вот документ от IBM относительно Windows; http://www-01.ibm.com/support/docview.wss?uid=swg21392080

+0

Я должен был упомянуть, что я разрабатываю машину на Windows 10. Я не уверен, что вы можете установить ulimit в Windows. – Oddball

+0

Обновлено ответ –

+0

Спасибо за предложение. Похоже, что подсистема Microsoft для UNIX-приложений (SUA) или Windows Services для UNIX (SFU) обе устарела в Windows 8.1 Enterprise, поэтому я не могу изменять эти значения реестра, поскольку они не существуют в Windows 10. – Oddball

Смежные вопросы