2014-10-29 17 views
3

我有一個Nodejs應用程序,用於執行大型Web應用程序的簡單端到端測試。此應用程序使用mikeal/RequestCheerio模塊在整個應用程序中導航,請求,遍歷和檢查網頁。Nodejs + mikeal/Request模塊,如何關閉請求或增加MaxSockets

我們正在重構一些測試,並且在串聯調用多個request函數時會遇到問題。我相信這可能是由於Node.js進程觸及MaxSockets限制,但我不完全確定。

一些代碼...

var request = require('request'); 
var cheerio = require('cheerio); 
var async = require('async'); 

var getPages_FromMenuLinks = function() { 
    var pageUrl = 'http://www.example.com/app'; 
    async.waterfall([ 
     function topPageRequest(cb1) { 
      var menuLinks = []; 
      request(pageUrl, function(err, resp, page) { 
       var $ = cheerio.load(page); 
       $('div[class*="sub-menu"]').each(function (i, elem) { 
        menuLinks.push($(this).find('a').attr('href'); 
       }); 
       cb1(null, menuLinks); 
      }); 
     }, function subMenuRequests(menuLinks, cb2) { 
      async.eachSeries(menuLinks, functionv(link, callback) { 
       request(link, function(err, resp, page) { 
        var $ = cheerio.load(page); 
        // do some quick validation testing of elements on the expected page 
        callback(); 
       }); 
      }, function() { cb2(null) }); 
     } 
    ], function() { }); 
}; 
module.export = getPages_FromMenuLinks; 

現在,如果我運行此腳本節點,它貫穿於第一topPageRequest並啓動subMenuRequests,但隨後在完成第三子菜單項的請求後,凍結。

看來我可能在Node或我的機器上打了Max-Sockets限制(?) - 我在標準的Windows 8機器上運行Node v0.10.26來測試它。

我試過使用request({pool:{maxSockets:25}, url:link}, function(err, resp...,但它似乎沒有任何區別。

它似乎也有一種方法來中止請求對象,如果我第一次實例化它(如發現here)。但我不知道如何「解析」page,類似於上述代碼中發生的情況。換句話說,從溶液中發現in the link ...

var theRequest = request({ ... }); 
theRequest.pipe(parser); 
theRequest.abort(); 

...,我將如何重新寫我的代碼pipe和「解析」的要求?

+0

你的代碼似乎有一些錯誤。最明顯的是'this.pageUrl ='http://www.example.com/app';',稍後再提及'pageUrl'。我無法想象這會起作用,所以也許你可以從那裏開始。一些調試技巧:1)我會嘗試升級到最新的節點,以防萬一您最近修復了Windows上的錯誤。 2)最後,我會建議通過[charles web proxy](http://www.charlesproxy.com/)發送您的請求,以查看真正發生的事情。 'require('request').defaults({'proxy':'http:// localhost:8888'})'通過charles發送請求 – mattr 2014-11-03 17:45:01

+0

@mattyice Typo已更正。我現在正在通過代理檢查交通詳情。 – mjmoody383 2014-11-04 20:35:20

回答

1

您可以同時輕鬆地創建數千個請求(例如從一個for loop),並且一旦提供了特定的請求,它們就會一個接一個地排隊並自動終止。

我認爲默認情況下每個域有5個套接字,在你的情況下這個限制應該足夠多。

這很可能是您的服務器無法正確處理您的請求(例如錯誤,它們沒有終止並無限期地掛起)。

有三個步驟,你可以找出是怎麼回事:

  1. 檢查,如果您正在發送正確的請求 - 作爲@mattyice發現有代碼中的一些錯誤。

  2. 調查服務器代碼和您的請求在那裏處理的方式 - 對我來說,似乎服務器不會首先提供/終止它們。

  3. 嘗試在發送請求時使用setTimeout。 5000ms應該有一段合理的時間來等待。超時時,請求將以適當的錯誤代碼中止。

作爲建議:我建議您使用一些更適合,更易於使用和更準確的工具來進行測試:例如, phantomjs。