Javascript 如何保存页面对象以供以后使用?

Javascript 如何保存页面对象以供以后使用?,javascript,node.js,puppeteer,Javascript,Node.js,Puppeteer,我的木偶师将有多个用户访问它,但在他们访问之后或开始之前,如果他们想做更多的动作或不想做更多的动作,我想跟踪他们打开的页面。如果未执行任何操作,请在30分钟后关闭页面 我看到有browser.pages来获取索引,但不知道如何使用这个功能 我的应用程序是一个REST服务器,用户将在其中发布请求,木偶演员将执行一些任务。 当请求传入时,将调用一个函数,该函数为用户ID创建一个页面,并将该页面存储在中以供以后使用。然后,当第二个请求命中时,您从映射中获取现有页面,执行“完成”任务,然后关闭页面 示例

我的木偶师将有多个用户访问它,但在他们访问之后或开始之前,如果他们想做更多的动作或不想做更多的动作,我想跟踪他们打开的页面。如果未执行任何操作,请在30分钟后关闭页面

我看到有
browser.pages
来获取索引,但不知道如何使用这个功能

我的应用程序是一个REST服务器,用户将在其中发布请求,木偶演员将执行一些任务。

当请求传入时,将调用一个函数,该函数为用户ID创建一个页面,并将该页面存储在中以供以后使用。然后,当第二个请求命中时,您从映射中获取现有页面,执行“完成”任务,然后关闭页面

示例代码 为简单起见,此示例使用。该代码启动服务器并注册两个功能:

  • /open?userid=XXX
    将调用给定userid的启动任务
  • /close?userid=XXX
    将调用给定userid的完成任务
这是一个没有错误处理或边缘情况的最小示例(例如,如果您两次调用open函数而不调用close,会发生什么情况)

const express=require('express');
常量app=express();
const木偶演员=要求(“木偶演员”);
//包含打开的页面(每个用户ID)
const openPages=新映射();
//设置任务,创建页面
异步函数openTask(用户ID、浏览器){
//创建页面并保存在地图中
const page=wait browser.newPage();
openPages.set(userid,page);
//执行第页上的启动任务
等待页面。转到('http://www.google.com/');
// ...
//始终在30分钟后调用closeTask
setTimeout(()=>closeTask(userid),30*60*1000;
}
//结束任务,关闭页面
异步函数closeTask(用户ID){
const page=openPages.get(userid);
如果(!第页){
返回;
}
//执行第页上的结束任务,然后关闭第页
// ...
等待页面。关闭();
}
(异步()=>{
const browser=wait puppeter.launch();
//这样调用:/open?userid=123
app.get('/open',异步函数(req,res){
const userid=req.query.userid;
等待openTask(用户ID、浏览器);
res.end(`openfinishedforuserid${userid}`);
});
//这样调用:/close?userid=123
app.get('/close',异步函数(req,res){
const userid=req.query.userid;
等待关闭任务(用户ID、浏览器);
res.end(`close finished for userid${userid}`);
});
app.listen(3000);
})();

页面、上下文、浏览器 根据您的任务,您应该考虑使用或替代页面是否更有意义。这将使任务彼此更加独立,这意味着如果一个浏览器崩溃,它将不会影响任何其他任务。此外,使用页面还将使所有任务共享cookie。

Concept 当请求传入时,将调用一个函数,该函数为用户ID创建一个页面,并将该页面存储在中以供以后使用。然后,当第二个请求命中时,您从映射中获取现有页面,执行“完成”任务,然后关闭页面

示例代码 为简单起见,此示例使用。该代码启动服务器并注册两个功能:

  • /open?userid=XXX
    将调用给定userid的启动任务
  • /close?userid=XXX
    将调用给定userid的完成任务
这是一个没有错误处理或边缘情况的最小示例(例如,如果您两次调用open函数而不调用close,会发生什么情况)

const express=require('express');
常量app=express();
const木偶演员=要求(“木偶演员”);
//包含打开的页面(每个用户ID)
const openPages=新映射();
//设置任务,创建页面
异步函数openTask(用户ID、浏览器){
//创建页面并保存在地图中
const page=wait browser.newPage();
openPages.set(userid,page);
//执行第页上的启动任务
等待页面。转到('http://www.google.com/');
// ...
//始终在30分钟后调用closeTask
setTimeout(()=>closeTask(userid),30*60*1000;
}
//结束任务,关闭页面
异步函数closeTask(用户ID){
const page=openPages.get(userid);
如果(!第页){
返回;
}
//执行第页上的结束任务,然后关闭第页
// ...
等待页面。关闭();
}
(异步()=>{
const browser=wait puppeter.launch();
//这样调用:/open?userid=123
app.get('/open',异步函数(req,res){
const userid=req.query.userid;
等待openTask(用户ID、浏览器);
res.end(`openfinishedforuserid${userid}`);
});
//这样调用:/close?userid=123
app.get('/close',异步函数(req,res){
const userid=req.query.userid;
等待关闭任务(用户ID、浏览器);
res.end(`close finished for userid${userid}`);
});
app.listen(3000);
})();

页面、上下文、浏览器
根据您的任务,您应该考虑使用或替代页面是否更有意义。这将使任务彼此更加独立,这意味着如果一个浏览器崩溃,它将不会影响任何其他任务。此外,使用页面还将使所有任务共享cookies。

您想让其他用户选择从他们的Puppeter脚本连接到您的浏览器实例池,还是希望每个用户请求执行一个任务(如制作屏幕截图)?不清楚什么?只需执行一个任务,第一个任务是注册课程,第二个任务(可选,仅持续30分钟)删除当前注册。对于browser.page,我没有深入研究过它,只是知道存在一个方法。您想让其他用户选择从他们的Puppeter脚本连接到您的浏览器实例池,还是希望每个用户请求执行一个任务(如制作屏幕截图)?Wh