node.js - Nodejs+ mikeal/요청 모듈, 요청을 닫거나 MaxSockets를 늘리는 방법



request (1)

대형 웹 응용 프로그램의 간단한 종단 간 테스트를 수행하도록 설계된 Nodejs 응용 프로그램이 있습니다. 이 응용 프로그램은 mikeal / RequestCheerio 모듈을 사용하여 응용 프로그램에서 웹 페이지를 탐색, 요청, 트래버스 및 검사합니다.

우리는 몇 가지 테스트를 리팩토링하고 있으며 여러 request 함수가 연속적으로 호출 될 때 문제가 발생합니다. 이 문제는 MaxSockets 제한을 두드리는 Node.js 프로세스로 인한 것일 수 있지만 완전히 확신 할 수는 없습니다.

일부 코드 ...

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 실행하고 topPageRequest 를 시작하지만 세 번째 하위 메뉴 항목에 대한 요청을 완료 한 후 멈 춥니 다.

Node 나 내 컴퓨터 (?)에서 최대 소켓 한도를 치는 것 같습니다. 표준 Windows 8 시스템에서 노드 v0.10.26을 실행하고 테스트합니다.

request({pool:{maxSockets:25}, url:link}, function(err, resp... )을 사용해 보았지만 아무런 차이가없는 것 같습니다.

또한 요청 객체를 중단시키는 방법이있는 것처럼 보입니다. 먼저 여기에 설명 된 대로 요청 객체를 인스턴스화하면됩니다. 그러나 위 코드에서 발생한 것과 유사하게 page "파싱"하는 방법을 모르겠습니다. 즉, 링크에서 발견 된 솔루션에서 ...

var theRequest = request({ ... });
theRequest.pipe(parser);
theRequest.abort();

... 어떻게 코드를 pipe 다시 작성하고 요청을 "파싱"할까요?

https://src-bin.com


Answer #1

한 번 for loop 하나 for loop 만으로 수천 개의 요청을 동시에 쉽게 만들 수 있으며 특정 요청이 처리되면 자동으로 하나씩 대기열에 넣어 종료됩니다.

나는 기본적으로 도메인 당 5 개의 소켓이 있다고 생각하며 귀하의 경우이 한계는 충분해야합니다.

서버가 요청을 제대로 처리하지 못했을 가능성이 큽니다 (예 : 오류가 발생해도 종료되지 않고 무기한 중지됩니다).

진행 상황을 확인하기 위해 다음 세 단계를 수행 할 수 있습니다.

  1. 적절한 요청을 보내고 있는지 확인하십시오. @mattyice가 코드에 버그가 있음을 알았습니다.

  2. 서버 코드와 요청이 처리되는 방식을 조사하십시오. 서버가 먼저 서버를 서비스 / 종료하지 않는 것 같습니다.

  3. 요청을 보낼 때 setTimeout 사용해보십시오. 5000ms는 적당한 시간 동안 기다려야합니다. 시간 초과가되면 해당 오류 코드로 요청이 중단됩니다.

조언으로 : 사용하기 쉽고 사용하기 쉽고 정확한 도구를 사용하여 테스트를 수행하는 것이 좋습니다 (예 : phantomjs).





request