背景
我们正在使用Puppeteer在Node服务器上渲染PDF。我们正在使用一个API将大型查询字符串传递给该API,然后将其传递给Puppeteer。一旦Puppeteer呈现了网页,就会将GET查询字符串中的数据拉入呈现的HTML页面中,以便动态填充页面中的数据。页面呈现后,Puppeteer会将其转换为PDF,然后将其下载到客户端。
问题
我们意识到,当请求很大时,当我们使用GET请求访问API时,它将破坏浏览器。为了克服这个问题,我们将API作为POST进行了攻击,并对数据进行了哈希处理,以便以后可以呈现它。
这使我们想知道是否存在用于渲染用于呈现PDF的网页的puppeteer函数的最大字符。
示例代码
const browser = await puppeteer.launch({
args: ['--no-sandbox', '--disable-setuid-sandbox'],
ignoreHTTPSErrors: true,
dumpio: false
});
const page = await browser.newPage();
const data = reqMethod === 'POST' ? req.body : JSON.parse(req.query.data);
const {pdfOptions, ...templateData} = data;
const url = `${PDF_API_PROD}/${template}?data=${JSON.stringify(templateData)}`;
await page.goto(url);
const pdfBuffer = await page.pdf({
format: 'A4',
margin: {
top: '20px',
left: '20px',
right: '20px',
bottom: '20px',
},
...pdfOptions,
});
问题
查看上面的代码后,您将看到我们将数据对象作为GET参数直接传递到URL中。这将用于使用Puppeteer渲染网页。
使用Puppeteer渲染网页后,GET字符串中的数据将使用JavaScript提取到网页中,以便动态渲染页面。
可以传递到Puppeteer函数await page.goto(url);
中的最大字符是什么?
答案 0 :(得分:0)
浏览器没有内置硬限制。我本人可以将长度不超过2000000
个字符的URL发送到服务器,而没有任何问题。即使那样,我也遇到了麻烦,因为发送数据只需要一些时间。
如果您在发送大型ULR时遇到问题,很可能是以下两件事之一:
1。服务器未正确配置为接收数据量。
要接收大量数据,必须正确配置服务器。默认情况下,大多数服务器会限制可通过URL发送的数据。
2。您正在超时
请记住,发送几MB的数据可能需要一些时间,具体取决于您的Internet连接和服务器上载速度。在HTTP请求的头部发送数据而不是在主体内部作为流发送数据也可能会更慢。在我的测试案例中,这是限制因素。
因此:很可能,您遇到的问题与操纵up无关,而与接收端有关。
您正在考虑操纵up可能截断URL:事实并非如此。木偶戏只是DevTools Protocol的包装。 Puppeteer将take the URL argument打包为payload via JSON.stringify
的一部分,并将其发送到浏览器。我怀疑DevTools协议在Page.navigate中是否内置任何限制。因此,此处不应通过伪装者引入“特定于库的”。