0

嗨,我正在尝试制作屏幕截图服务

const puppeteer = require('puppeteer');
var resWidth = 1366;
var resHeight = 1000;
var browser;

(async () => {
browser = await puppeteer.launch({ignoreHTTPSErrors: true});
});

当我收到一份工作时,我会尝试做

data.forEach(function(d){
    try {
        console.log(d["url"]);
        (async () => {
            var page = await browser.newPage();
            await page.setViewport({width: resWidth, height: resHeight});
            await page.goto(d["url"], {timeout: 90000, waitUntil: 'networkidle'});
            await page.screenshot({path: './picdata/' + d['id'] + '.png' ,fullPage: true});
            await page.close();
        })();

    } catch(e) {}
});

但我不能......这是错误:

(node:40596) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 7): TypeError: Cannot read property 'newPage' of undefined

我不想为每个屏幕截图打开一个新浏览器,启动浏览器需要时间并且需要更多内存?

我应该怎么办?

4

1 回答 1

1

问题:

(async () => { browser = await puppeteer.launch({ignoreHTTPSErrors: true}); });

这段代码永远不会被执行。为什么?因为这不是真正的关闭。

更多关于闭包的信息,请看这里

话虽如此,这对于您的给定场景不起作用,因为它们是异步任务。

我尝试使用您的示例:

'use strict';
const puppeteer = require('puppeteer');
const resWidth = 1366;
const resHeight = 1000;
let browser;
let page;

async function launchBrowser() {
  browser = await puppeteer.launch({ headless: true }); //this "{ headless: true }" will ensure a browser window is not open a single time.
};

launchBrowser().then((x) => { // wait until browser has launched
  data.forEach(async (d) => {
    try {
      page = await browser.newPage(); // the document is not very clear about this method, so I am still unsure if I could move this in the above launchBrowser() method. 
      await page.setViewport({ width: resWidth, height: resHeight });
      await page.goto(d['url'], { timeout: 90000, waitUntil: 'networkidle' });
      await page.screenshot({ path: './picdata/' + d['id'] + '.png', fullPage: true });
    }
    catch (e) {
      console.log(e);
      await browser.close(); // close browser if there is an error
    }
  });
})
.then(() => {
  await browser.close(); // close browser finally.
});

专业提示:开始使​​用let,const而不是var.

有一篇很棒的文章,在这里

于 2017-10-11T19:13:54.507 回答