Концепция
Когда приходит запрос, вызывается функция, которая создает страницу для идентификатора пользователя и сохраняет эту страницу в Map для дальнейшего использования. Затем, когда поступит второй запрос, вы берете существующую страницу с карты, выполняете задачу «Завершение» и впоследствии закрываете страницу.
Пример кода
Для простоты в этом примере используется express . Код запускает сервер и регистрирует две функции:
/open?userid=XXX
вызовет начальную задачу для данного идентификатора пользователя
/close?userid=XXX
вызовет завершающее задание для данного идентификатора пользователя
Это минимальный пример без обработки ошибок или крайних случаев (как, например, если вы дважды вызываете функцию open без вызова close).
const express = require('express');
const app = express();
const puppeteer = require("puppeteer");
// contains the open pages (per userid)
const openPages = new Map();
// setup task, creates page
async function openTask(userid, browser) {
// create page and save in our map
const page = await browser.newPage();
openPages.set(userid, page);
// execute start task on page
await page.goto('http://www.google.com/');
// ...
// always call closeTask after 30min
setTimeout(() => closeTask(userid), 30 * 60 * 1000);
}
// end task, closes page
async function closeTask(userid) {
const page = openPages.get(userid);
if (!page) {
return;
}
// execute end task on page and close page after that
// ...
await page.close();
}
(async () => {
const browser = await puppeteer.launch();
// Called like this: /open?userid=123
app.get('/open', async function (req, res) {
const userid = req.query.userid;
await openTask(userid, browser);
res.end(`open finished for userid ${userid}`);
});
// Called like this: /close?userid=123
app.get('/close', async function (req, res) {
const userid = req.query.userid;
await closeTask(userid, browser);
res.end(`close finished for userid ${userid}`);
});
app.listen(3000);
})();
Страницы, контексты, браузеры
В зависимости от вашей задачи вам следует подумать о том, имеет ли смысл использовать браузеры или контексты вместо страниц. Это сделало бы задачи более независимыми друг от друга, а это означает, что в случае сбоя одного браузера это не повлияет на другие задачи. Кроме того, использование страниц также сделает все задачи общими файлами cookie.