我正在使用带有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)
答案 0 :(得分:0)
我所做的是使用config/puppeteer.js
在runBrowser()
文件中启动浏览器。启动后,我保存了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();
...