簡體   English   中英

Nodejs + mikeal / Request模塊,如何關閉請求或增加MaxSockets

[英]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個套接字,在你的情況下這個限制應該足夠了。

您的服務器很可能無法正確處理您的請求(例如,錯誤時它們不會被終止並無限期掛起)。

您可以通過三個步驟找出發生的情況:

  1. 檢查您是否發送了正確的請求 - 因為@mattyice觀察到您的代碼中存在一些錯誤。

  2. 調查服務器代碼以及在那里處理請求的方式 - 對我而言,似乎服務器不首先服務/終止它們。

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM