将浏览器实例保存在process.env中

时间:2020-03-26 16:53:01

标签: javascript puppeteer

我正在使用带有express的api。我把浏览器作为中间件启动了。

// app.js

require('dotenv').config();
require('./config/puppeteer');
...
const app = express();
...

在启动浏览器的puppeter配置中,我使用puppeteer.launch([options]),然后将对象保存在porcess.env.BROWSER

// config/puppeteer.js

const puppeteer = require('puppeteer');

(async function runBrowser() {
    const browser = await puppeteer.launch({
        headless: process.env.NODE_ENV === 'development' ? false : true,
        slowMo: 10,
    });;
    process.env.BROWSER = JSON.stringify(browser);
})();

但是当我通过浏览器创建JSON.stringify时,出现以下错误:

DevTools listening on ws://127.0.0.1:56296/devtools/browser/3069f03b-0a46-4d59-b378-c38e650cba65
(node:17192) UnhandledPromiseRejectionWarning: TypeError: Converting circular structure to JSON
    --> starting at object with constructor 'Browser'
    |     property '_defaultContext' -> object with constructor 'BrowserContext'
    --- property '_browser' closes the circle
    at JSON.stringify (<anonymous>)
    at runBrowser (C:\Users\jcortes\devs\nodejs\scraper\config\puppeteer.js:9:32)

1 个答案:

答案 0 :(得分:0)

我所做的是使用config/puppeteer.jsrunBrowser()文件中启动浏览器。启动后,我保存了websocket的地址,以后再连接到同一实例(puppeteer.connect())。这样,我可以使用相同的浏览器,每次请求到达时,它都会创建一个新页面。

// config/puppeteer.js

const puppeteer = require('puppeteer');

(async function runBrowser() {
    const browser = await puppeteer.launch({
        headless: process.env.NODE_ENV === 'development' ? false : true,
        slowMo: 10
    });
    process.env.WSENDPOINT = browser.wsEndpoint();
})();

...
// app.js

require('dotenv').config();
require('./config/puppeteer');
...
const app = express();
...