我有一個Nodejs應用程序,用於執行大型Web應用程序的簡單端到端測試。此應用程序使用mikeal/Request和Cheerio模塊在整個應用程序中導航,請求,遍歷和檢查網頁。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
和「解析」的要求?
你的代碼似乎有一些錯誤。最明顯的是'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
@mattyice Typo已更正。我現在正在通過代理檢查交通詳情。 – mjmoody383 2014-11-04 20:35:20