【问题标题】:Nodejs Puppeteer Object undefined after function函数后未定义Nodejs Puppeteer对象
【发布时间】:2021-02-27 19:26:41
【问题描述】:

我正在尝试做一个 webScraping 应用程序,但是在初始化浏览器和页面对象时,它们在从 init() 函数返回后未定义。这是一个sn-p:

浏览器和页面在我的文件顶部初始化:browser = nullpage = null 所以我想在我的init() 函数中使用这些全局变量。

async function init() {
try {
    browser = await puppeteer.launch({
      headless: true,
      args: ["--disable-setuid-sandbox"],
      ignoreHTTPSErrors: true,
    });
    page = await browser.newPage();
  } catch (err) {
    console.log(err.message);
  }
  return {
    first: page,
    second: browser,
  };
}
var retvals = init();
browser = retvals.browser;
page = retvals.page;
console.log(typeof browser);
console.log(typeof page);

scrapeSite(urls[0]); 

我该如何解决这个问题? 提前致谢

【问题讨论】:

  • 如果将控制台日志放在此行之后会怎样:“page = await browser.newPage();”在抓到之前,你得到了什么?
  • @sohaieb 都存在类型对象。

标签: javascript node.js web-scraping puppeteer


【解决方案1】:

你从init()返回这个对象:

{
  first: page,
  second: browser,
}

但是你这样使用它:

var retvals = init();
browser = retvals.browser;
page = retvals.page;

你应该这样使用它:

var retvals = await init();
browser = retvals.second;
page = retvals.first;

但我确实建议重命名这些对象键,因为它会造成混淆(即使现在对你来说也是如此)。

另请注意,您将 init() 设为异步函数。每个异步函数都会返回一个 Promise,所以:

console.log(typeof browser);
console.log(typeof page);

在 promise 解决之前执行,这就是为什么这些是未定义的。所以你需要使用某种方式来处理异步代码,例如等待init()

【讨论】:

  • 它仍然未定义。我记得我也试过这个,但还是不行。
  • 我错过了一件事情:init() 是一个异步函数,因此它返回一个承诺。您需要等待它或使用.then()。我更新了我的答案。
猜你喜欢
  • 2021-11-06
  • 2022-01-26
  • 1970-01-01
  • 2018-06-07
  • 1970-01-01
  • 2015-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多