下面是我代码的简化版本:
var page;
var launched = false;
app.post("/test", async(req, res) => {
if ( launched == false ) {
const browser = await puppeteer.launch({
headless: true, /* I've tried with "new" and false too */
});
page = await browser.newPage();
var desiredUrl = "url here";
await page.goto(desiredUrl);
/* Stream data from the page */
await page.exposeFunction('writeData', (data) => {
console.log("Writing data");
res.write(data);
});
/* End stream */
await page.exposeFunction('endStream', () => {
console.log("End stream");
res.end();
});
launched = true;
}
await page.evaluate(async ()=>{
var output = await fetch("/endpoint_here", {
"headers": {
/* headers here */
},
});
var reader = output.body.getReader();
while (true) {
var { done, value } = await reader.read();
if (done) {
window.endStream();
return;
}
var decoder = new TextDecoder();
var decodedData = decoder.decode(value);
window.writeData(decodedData);
}
});
})
然而,这并不起作用.我try 的方法如下:
res在page. evaluate()中不起作用.我试着把res发送到page. evaluate()中,但是它会 destruct 代码.
我试过使用page. exposeFunction()并在那里执行res. write(和res. end()),它工作了,但只是第一次.第二次(以及之后的每一次)我发送post请求时,代码运行正常(它在那些函数中执行console. logs),只是它根本没有执行res. write()和res. end().
我甚至试着让它更新page. evaluate()中的一个全局变量,使用一个代理检测变量的变化,并执行res. write()来写入数据,但在第一次发布请求之后,这也中断了.
唯一解决这个奇怪的问题的唯一方法是重新启动程序,这显然不是一个解决方案.
我还try 将流数据记录到页面中的控制台,并使用page. on('console')将数据res. write()返回到客户端.一次只需要一个请求就能完美地工作.但是,当端点"/test"同时有多个请求时,它会将响应写入两个客户端,而不是只写入发起请求的客户端.
唯一的一件事,就是返回响应后,提取结束,没有流它.但是,我希望它是流.
我被困住了,不知道该怎么办,所以任何帮助都将不胜感激.