2015-06-23 25 views
1

我想從現有的mongo數據庫獲取數據,並且對於每個我得到的文檔,我需要向兩個不同的服務github和twitter發出2個請求。在Node中處理數據庫時如何評價限制?

如果我在我的光標上放了一個限制,但是當我增加或刪除限制時它停止工作,代碼將起作用。我認爲這是因爲我正在向github或twitter或兩者發出太多的併發請求。我收到消息

{ [Error: read ECONNRESET] code: 'ECONNRESET', errno: 'ECONNRESET', syscall: 'read' } 

我不知道如何解決這個問題。

col.find({}).limit(100).forEach(function (doc) { 
    var options = {}; 

    var params = {}; 

    request(options, function (err, response, body) { 
      request (options, function (err, response, body){ 
      // Stuff 
      }); 
     }); 
}, function (err) { 
    if (err) { 
     console.log(err); 
     return; 
    } 

    db.close(); 
}) 

回答

0

您基本上並行啓動100個HTTP請求(或您的查詢產生的文檔數量)。

非常有用的async模塊具有功能eachLimit來限制併發(並行運行)異步任務的數量。在你的情況,你可以利用它像這樣:

var async = require('async'); 

col.find({}).limit(100).toArray(function(err, docs) { 
    if (err) return console.log(err); 
    // Limit the # of concurrent HTTP requests to 2(-ish). 
    async.eachLimit(docs, 2, function(doc, asyncdone) { 
    request(options, function (err, response, body) { 
     if (err) return asyncdone(err); 
     request (options, function (err, response, body){ 
     if (err) return asyncdone(err); 
     // Stuff 
     return asyncdone(); 
     }); 
    }); 
    }, function(err) { 
    // If we get here, we're done. 
    if (err) { 
     console.log(err); 
     return; 
    } 
    db.close(); 
    }); 
}); 

注意.toArray()讀取所有的查詢結果到內存中第一次(但你.forEach()這是否和我認爲)。

+0

我試過了,但它沒有適用於所有的項目。當我傳遞2作爲async.eachLimit的迭代器數時,我只能上傳大約50個項目。當我通過100時,它增加到了400. 任何想法爲什麼會發生這種情況? – Jack

+0

NVM我修正了它。我忘了一個asyncdone。感謝幫助的人 – Jack

0

應該是由於請求調用過多造成的,可以使用異步庫來做請求限制。

mapLimit(ARR,限制,迭代器,[回調])

它很容易和瑣碎使用。

相關問題