Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 保持相同的木偶演员页面打开nodeJS_Javascript_Node.js_Puppeteer - Fatal编程技术网

Javascript 保持相同的木偶演员页面打开nodeJS

Javascript 保持相同的木偶演员页面打开nodeJS,javascript,node.js,puppeteer,Javascript,Node.js,Puppeteer,我正在开发一个API,在puppeter中打开的页面上运行一些JS,但我不想一直打开/关闭&等待页面加载,因为它是一个内容繁重的页面 是否可以在启动页面并使其永久打开的节点脚本上运行永久启动,然后在需要在此页面上运行javascript时调用单独的节点脚本 我尝试了以下操作,但页面似乎无法保持打开状态: keepopen.js 'use strict'; const puppeteer = require('puppeteer'); (async() => { const sta

我正在开发一个API,在puppeter中打开的页面上运行一些JS,但我不想一直打开/关闭&等待页面加载,因为它是一个内容繁重的页面

是否可以在启动页面并使其永久打开的节点脚本上运行
永久启动
,然后在需要在此页面上运行javascript时调用单独的节点脚本

我尝试了以下操作,但页面似乎无法保持打开状态:

keepopen.js

'use strict';
const puppeteer = require('puppeteer');

(async() => {
    const start = +new Date();
    const browser = await puppeteer.launch({args: ['--no-sandbox']});
    const page = await browser.newPage();
    await page.goto('https://www.bigwebsite.com/', {"waitUntil" : "networkidle0"});
    const end =  +new Date();
    console.log(end - start);
    //await browser.close();
})();
'use strict';

const puppeteer = require('puppeteer');

(async() => {
    const start = +new Date();
    const browser = await puppeteer.launch({args: ['--no-sandbox']});
    const page = await browser.targets()[browser.targets().length-1].page();
    const hash = await page.evaluate(() => {
        return runFunction();
    });
    const end =  +new Date();
    console.log(hash);
    console.log(end - start);
    //await browser.close();
})();
runjs.js

'use strict';
const puppeteer = require('puppeteer');

(async() => {
    const start = +new Date();
    const browser = await puppeteer.launch({args: ['--no-sandbox']});
    const page = await browser.newPage();
    await page.goto('https://www.bigwebsite.com/', {"waitUntil" : "networkidle0"});
    const end =  +new Date();
    console.log(end - start);
    //await browser.close();
})();
'use strict';

const puppeteer = require('puppeteer');

(async() => {
    const start = +new Date();
    const browser = await puppeteer.launch({args: ['--no-sandbox']});
    const page = await browser.targets()[browser.targets().length-1].page();
    const hash = await page.evaluate(() => {
        return runFunction();
    });
    const end =  +new Date();
    console.log(hash);
    console.log(end - start);
    //await browser.close();
})();
我运行以下命令:
永远启动keepopen.js
,然后运行
runjs.js
,但我得到了错误:

(node:1642) UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'evaluate' of null

您可以使用node运行一个http服务器,其中puppeter
页面
对象在启动时创建一次,然后通过将该代码放在您创建的http服务器的(所谓的“路由”函数(这只是一个服务于web请求的函数)中来启动当前脚本

只要
页面
对象是在包含您的代码的路由功能范围之外创建的,那么路由功能将在多个web请求之间保持对相同
页面
对象的访问

您可以反复使用相同的
页面
对象,而不必像当前一样为每次调用重新加载它。但是,您需要一个服务来在请求/调用之间持久化
页面
对象


您可以创建自己的http服务器(使用node的内置http包),也可以使用
express
(除了可以使用
express
,还有许多其他基于http的包)。

这样的两个node.js脚本之间不可能共享资源。您需要一个保持浏览器打开的服务器

代码示例

下面是一个使用库启动服务器的示例。调用
/start browser
启动浏览器,并将浏览器和页面对象存储在当前函数之外。这样,第二个函数(在访问
/run
时调用)可以使用
页面
对象在其中运行代码

const express=require('express');
常量app=express();
让浏览器,页面;
app.get('/start browser',异步函数(req,res){
browser=wait puppeter.launch({args:['--no sandbox']});
page=wait browser.newPage();
res.end(“浏览器已启动”);
});
app.get('/run',异步函数(req,res){
等待页面。评估(()=>{
// ....
});
res.end('Done');//您也可以在此处返回结果
});
app.listen(3000);
请记住,这是一个简单的例子,让你开始。在现实世界中,您需要捕获错误,可能还需要不时重新启动浏览器