我有一个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