cheerio каждая функция () ведет себя странно - PullRequest
0 голосов
/ 21 октября 2018

У меня есть код, который записывает на сайт определенную страницу.Я использую кукловод + Cheerio, чтобы сделать это.На моем ноутбуке код работает отлично.Но после развертывания его на VDS, cheerio каждый () селектор начал работать странно.(Но он все еще отлично работает на моем ноутбуке).Проблема заключается в том, что в VDS возникает следующая ошибка:

(узел: 28544) UnhandledPromiseRejectionWarning: TypeError: Невозможно прочитать свойство «trim» undefined в узле.(/home/ubuntu/handbot/liveMonitoring.js:211:82) at initialize.exports.each (/home/ubuntu/handbot/node_modules/cheerio/lib/api/traversing.js:300:24) в узле.(/home/ubuntu/handbot/liveMonitoring.js:182:29) at initialize.exports.each (/home/ubuntu/handbot/node_modules/cheerio/lib/api/traversing.js:300:24) в liveMonitoring (/home / ubuntu / handbot / liveMonitoring.js: 175: 28) at process._tickCallback (internal / process / next_tick.js: 68: 7) (узел: 28544) UnhandledPromiseRejectionWarning: необработанное отклонение обещания.Эта ошибка возникла либо из-за того, что внутри асинхронной функции возникла ошибка без блока catch, либо из-за отклонения обещания, которое не было обработано с помощью .catch ().(идентификатор отклонения: 1) (узел: 28544) [DEP0018] Предупреждение об устаревании: отклонения необработанного обещания устарели.В будущем отклонения обещаний, которые не обрабатываются, завершат процесс Node.js с ненулевым кодом выхода.

Наиболее интересным моментом является то, что иногда ошибка исчезает (кажется, что нетшаблон, в котором возникает ошибка).Я пытался решить эту проблему путем переустановки узла js, но это не сработало.Проблема не в моем коде (так как он работает на моем ноутбуке и даже иногда на VDS).Я думаю, что есть что-то с экспортом каждой () функции.Поскольку из-за сообщения об ошибке что-то не так происходит в

/ home / ubuntu / handbot / node_modules / cheerio / lib / api / traversing.js: 300: 24

Код traversing.js (298-302 строки):

`

exports.each = function(fn) {
     var i = 0, len = this.length;
     while (i < len && fn.call(this[i], i, 
     this[i]) !== false) ++i;
     return this;
};

Код, вызывающий ошибку:

const page = await browser.newPage();
await page.goto(url, {timeout:0}).catch((err)=> { console.log(err)});

await page.setRequestInterception(true);

page.on('request', req => {

    if(['image', 'stylesheet', 'font'].indexOf(req.resourceType()) !== -1)
        req.abort();
    else
        req.continue();

    });

 let content = await page.content();
 let $ = cheerio.load(content);



 let gameContent=$('#games_content').children('div').children('div');



 gameContent.children().each(function(i, elem1){

     let league=$(elem1).children('.greenBack').children('.c-events__name').children('a').text().trim();

     $(this).children().each(function(j, elem2){

         if(j!==0) {

             let currentInfo = {};
             currentInfo['league'] = league;

             let shortCut = $(elem2).children('.c-events__item_game').children('.c-events-scoreboard').children();
             let mainInfo = shortCut.first();

             currentInfo['link'] = mainInfo.children("a").attr("href");
             let teams = mainInfo.children("a").children("span").attr("title").trim().split("—");
             currentInfo['team1'] = teams[0].trim();
             currentInfo['team2'] = teams[1].trim();

             let shortCutForTotal = $(elem2).children('.c-events__item_game').children('.c-bets');

         }
     });
 });

СпасибоВы заранее!`

1 Ответ

0 голосов
/ 21 октября 2018

Проблема была решена путем изменения этих строк кода:

page.on('request', req => {

 if(['image', 'stylesheet', 'font'].indexOf(req.resourceType()) !== -1)       
   req.abort();
 else 
   req.continue();

})

со следующими:

page.on('request', interceptedRequest => {

     if (interceptedRequest.url().endsWith('.png') || interceptedRequest.url().endsWith('.jpg') || interceptedRequest.url().endsWith('.css'))

         interceptedRequest.abort();
     else

         interceptedRequest.continue();
});

и размещения await page.goto(url); после вышеуказанных строк кода.

Затем добавление опции waitUntil:'networkidle0' к page.goto(url)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...