[英]Nodejs + mikeal/Request module, how to close request or increase MaxSockets
我有一個Nodejs應用程序,旨在執行大型Web應用程序的簡單端到端測試。 該應用程序使用mikeal /請求和Cheerio模塊導航,請求,遍歷和檢查整個應用程序的網頁。
我們正在重構一些測試,並且在串行調用多個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;
現在,如果我運行此Node腳本,它將運行第一個topPageRequest
並啟動subMenuRequests
,但在完成第三個子菜單項的請求后凍結。
似乎我可能在Node或我的機器上達到Max-Sockets限制(?) - 我在標准的Windows 8機器上測試它,運行Node v0.10.26。
我嘗試過使用request({pool:{maxSockets:25}, url:link}, function(err, resp...
,但似乎沒有任何區別)。
如果我首先實例化它(如此處所示 ),似乎還有一種方法可以中止請求對象。 但我不知道如何“解析” page
,類似於上面代碼中發生的情況。 換句話說,從鏈接中找到的解決方案......
var theRequest = request({ ... });
theRequest.pipe(parser);
theRequest.abort();
...,我如何重新編寫代碼以pipe
並“解析”請求?
您可以同時輕松地生成數千個請求(例如,從單個for loop
),並且一旦提供特定請求,它們將排隊並逐個自動終止。
我認為默認情況下每個域有5個套接字,在你的情況下這個限制應該足夠了。
您的服務器很可能無法正確處理您的請求(例如,錯誤時它們不會被終止並無限期掛起)。
您可以通過三個步驟找出發生的情況:
檢查您是否發送了正確的請求 - 因為@mattyice觀察到您的代碼中存在一些錯誤。
調查服務器代碼以及在那里處理請求的方式 - 對我而言,似乎服務器不首先服務/終止它們。
嘗試在發送請求時使用setTimeout
。 5000ms應該是合理的等待時間。 超時時,請求將以適當的錯誤代碼中止。
作為建議:我建議使用一些更合適,更容易使用和更准確的工具來進行測試:例如phantomjs。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.