2014-10-29 134 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。