Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.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
Node.js 如何配置Puppeter以正确呈现外部JS页面?仅适用于本地主机URL_Node.js_Puppeteer_Google Chrome Headless_Serverside Javascript - Fatal编程技术网

Node.js 如何配置Puppeter以正确呈现外部JS页面?仅适用于本地主机URL

Node.js 如何配置Puppeter以正确呈现外部JS页面?仅适用于本地主机URL,node.js,puppeteer,google-chrome-headless,serverside-javascript,Node.js,Puppeteer,Google Chrome Headless,Serverside Javascript,我正在尝试为外部Javascript页面配置服务器端呈现。 我使用Puppeter就是为了这个目的,当我提供任何外部URL(不是本地主机页面)时,Puppeter只获取URL的源代码(您可以在请求页面的查看源代码模式中看到),而不呈现整个DOM。 当我尝试SSR任何localhost Javascript页面URL(由本地主机上的同一个节点js服务器生成的页面)时,一切正常 请告知我是否遗漏了什么,或者我需要尝试另一种方法 我成功地在本地主机上配置了所有依赖项的Puppeter,如下所示: 当前

我正在尝试为外部Javascript页面配置服务器端呈现。 我使用Puppeter就是为了这个目的,当我提供任何外部URL(不是本地主机页面)时,Puppeter只获取URL的源代码(您可以在请求页面的查看源代码模式中看到),而不呈现整个DOM。 当我尝试SSR任何localhost Javascript页面URL(由本地主机上的同一个节点js服务器生成的页面)时,一切正常

请告知我是否遗漏了什么,或者我需要尝试另一种方法

我成功地在本地主机上配置了所有依赖项的Puppeter,如下所示:

当前,“html”变量只返回获取的URL的源代码,我需要接收请求URL的完全呈现DOM

server.js中的代码

var puppeter=require('puppeter');
异步函数ssr(url){
console.info('在ssr模式下呈现页面');
const browser=wait puppeter.launch({headless:true});
const page=wait browser.newPage();
试一试{
wait page.goto(url,{waitUntil:'domcontentloaded'});
}捕捉(错误){
控制台错误(err);
抛出新错误('page.goto/waitForSelector超时');
}
const html=wait page.content();
等待浏览器关闭();
返回{html};
}
module.exports=ssr;
app.js中的代码

var err=require('http-errors');
var express=需要(“express”);
var path=require('path');
var-ssr=require('./ssr.js');
var-app=express();
app.listen(3000,function(){console.info('Server listening on port');});
应用程序使用('/index/',异步(req,res)=>{
const{html}=await-ssr(`www.example.com`);
返回res.send(html);
});
试试看


问题很可能是您没有给页面足够的时间来呈现DOM内容<代码>{waitUntil:'domcontentloaded'}只等待事件,不等待任何AJAX请求或DOM修改

尝试使用
'networkidle0'
'load'
作为函数的
waitUntil

如果不起作用,您有两个选择:

  • 通过使用为页面提供固定的时间来呈现页面
  • 用于在调用
    page.content()
    之前等待加载特定选择器。这样,您可以确保您感兴趣的文档部分已加载

在发布我的公开问题之前,我实际上尝试过使用谷歌官方文档中描述的选项:“networkidle0”、“networkidle2”和page.waitForSelector(…),但结果是一样的——Puppeter只返回了URL的源html代码(好像我在查看源代码模式下检查了页面一样)。所有这些都只适用于本地主机上NodeJS生成的页面。我都不知道该查什么,嗨,托马斯!但不幸的是。。。这可能是因为localhost(但我想没有理由)。来自Chrome开发者论坛的人;我没有回答。不,主意…我在终端收到404份报告,所有链接的脚本和图像…嗨,拉卡哈巴布!谢谢你的回复!我还不是一个专家,所以你能澄清一下我应该在哪里集成你提供的代码吗?在你的try语句中谢谢Rakah。我再试了一次——终端中只返回请求页面的源代码,不呈现JS构建的DOM。我不知道该怎么做…我不知道你想要的输出是什么。例如,您希望标题文本在本例中为“示例”,还是希望其类似于此“示例”
const html = 'what ever you selector is but since you want the html just type in "html"'; 

let gg = await page.evaluate((sel) => {
        let element = document.querySelector(sel);
        console.log ('got Boom');
        return element? element.innerHTML: null;
    }, html);


    console.log (gg);