如何使用Puppeteer流式获取网络请求数据而非完整响应
解决方案
要实现流式传输目标API的响应数据,核心是不要用response.text()(它会等待完整响应加载完成),而是直接获取响应的可读流,再将其管道(pipe)到你的服务器响应对象res上。以下是修改后的代码:
page.on('response', async (response) => { const url = response.url(); if (url.includes("/api/answer")) { // 获取响应的可读流 const responseStream = await response.body(); // 设置流式响应的必要头信息(根据目标API的Content-Type调整) res.setHeader('Content-Type', 'text/plain; charset=utf-8'); res.setHeader('Transfer-Encoding', 'chunked'); // 将Puppeteer获取的流管道到服务器响应 responseStream.pipe(res); // 处理流的错误事件,避免进程崩溃 responseStream.on('error', (err) => { console.error('流式传输出错:', err); if (!res.headersSent) { res.status(500).send('流式传输失败'); } }); } });
关键说明:
response.body():返回Node.js的ReadableStream,可直接用于流式处理,无需等待完整响应加载。pipe(res):将上游的响应流直接转发到客户端,实现实时分块传输数据。- 响应头设置:确保
Content-Type匹配目标API返回的类型(如果是JSON流就设为application/json),Transfer-Encoding: chunked告诉客户端这是分块响应。 - 错误处理:监听流的
error事件,防止因网络问题或其他异常导致进程崩溃。
内容的提问来源于stack exchange,提问作者Akthar
相关产品推荐
相关产品推荐

