Подождите, пока функция не будет завершена, а затем визуализируйте страницу - PullRequest
0 голосов
/ 21 марта 2019

У меня есть функция, которая очищает элемент и возвращает значение элемента.Это код reale-scraper.js :

module.exports.RealeScraper = function() {

return new Promise((res, rej) => {

var url = 'example.com';
var compagnia;

//Start Puppeteer and scrape element
ptr.launch().then(async browser => {
    const page = await browser.newPage();
    await page.setViewport({ width: 1280, height: 800 });

    await page.goto(url, {waitUntil: "networkidle0"});

    await page.type('input[name="username"]', config.utente);
    await page.type('input[name="password"]', config.pass);

    await Promise.all([
        page.click('input[type="SUBMIT"]'),
        page.waitForNavigation({waitUntil: 'networkidle2'})
    ]);

    await page.waitForSelector('#tableSceltaProfilo > tbody > tr:nth-child(1) > td:nth-child(2)');

    const element = await page.$("#tableSceltaProfilo > tbody > tr:nth-child(1) > td:nth-child(2)");
    compagnia = await page.evaluate(element => element.textContent, element);

    await page.screenshot({path: 'screenshot.png'});

    await browser.close();
});

res(compagnia);
});
} 

Затем я вызываю эту функцию и пытаюсь отправить данные в мой шаблон ejs в home.js :

var scraper = require('../scrapers/reale-scraper');
router.get('/home', function(req, res, next) {

 RealeScraper().then((compagnia) => {
     res.render('nuovo-sinistro', {
        titolo: 'Manager Perizie',
        compagnia: compagnia
     });
 }).catch((error) => {
     console.log(error);
 });
 });

Я хочу дождаться окончания RealeScraper и вернуть мне значение, чтобы я мог передать его в res.render.Я пытался использовать Promise, но это не работает.Это не дает мне ошибок, но когда я загружаю страницу, функция не запускается и отображается без переменной.

Я также пробовал разные методы, но в итоге загрузка страницы длилась вечно

Любая помощь будет очень признательна, спасибо!

1 Ответ

0 голосов
/ 21 марта 2019

Вы звоните //Start Puppeteer and scrape element и res(compagnia); одновременно, в то время как compagnia пусто, оно было возвращено.

Просто позвоните res, когда scrape element закончено.

...
await browser.close();
res(compagnia);
...

Я думаю, будет лучше, если вы будете использовать async\await вот так:

module.exports.RealeScraper = async function () {
  var url = 'example.com';
  var compagnia;

  //Start Puppeteer and scrape element
  let browser = await ptr.launch();
  const page = await browser.newPage();
  await page.setViewport({ width: 1280, height: 800 });

  await page.goto(url, { waitUntil: "networkidle0" });

  await page.type('input[name="username"]', config.utente);
  await page.type('input[name="password"]', config.pass);

  await page.click('input[type="SUBMIT"]'); // why you do that in parallel?
  await page.waitForNavigation({ waitUntil: 'networkidle2' });

  await page.waitForSelector('#tableSceltaProfilo > tbody > tr:nth-child(1) > td:nth-child(2)');

  const element = await page.$("#tableSceltaProfilo > tbody > tr:nth-child(1) > td:nth-child(2)");
  compagnia = await page.evaluate(element => element.textContent, element);

  await page.screenshot({ path: 'screenshot.png' });

  await browser.close();

  return compagnia;
}



// ...
var scraper = require('../scrapers/reale-scraper');
router.get('/home', async function (req, res, next) {

  try {
    let compagnia = await RealeScraper();
    res.render('nuovo-sinistro', {
      titolo: 'Manager Perizie',
      compagnia: compagnia
    });
  } catch (error) {
    console.log(error);
  }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...