2016-02-01 83 views
2

我的節點/回送服務器有一個零星的問題。我的設置如下:Node.js零星的'ECONNREFUSED'錯誤request.get

編輯:我的節點版本是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

大多數系統的ulimit默認值爲1024.請參閱limits.conf手冊(http://linux.die.net/man/5/limits.conf)。

雖然@ migg關於確保您的應用程序中沒有內存泄漏並且它的流程處理是正確的,但調整系統的高負載也是很多應用程序的正常流程。

試試看看是否有幫助;

$的ulimit -n 65535

編輯:我沒有測試過這一點,但這裏是IBM關於Windows中的文件; http://www-01.ibm.com/support/docview.wss?uid=swg21392080

+0

我應該提到我正在開發Windows 10機器。我不確定你是否可以在Windows中設置ulimit。 – Oddball

+0

更新了答案 –

+0

感謝您的建議。看來微軟的基於UNIX的應用程序子系統(SUA)或Windows服務UNIX版(SFU)在Windows 8.1 Enterprise中都被棄用,所以我不能修改這些註冊表值,因爲它們在Windows 10上不存在。 – Oddball