You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将PDF流转换为Buffer时报stream.on is not a function错误如何解决

错误根因

你抛出TypeError: stream.on is not a function的核心原因是:extractStreamFromResponse返回的stream本质是字符串类型,不是Node.js可读流对象,自然没有on方法可以调用。而且你把responseType: 'stream'返回的流提前转成了字符串,既多此一举还会破坏PDF的二进制内容,导致最终生成的Buffer损坏。

正确实现方案

你不需要手动拆分multipart响应的流,axios返回的流本身可以直接收集,或者如果确实需要拆分multipart内容,推荐按二进制逻辑处理,避免编码问题。

方案1:直接收集PDF流(接口直接返回PDF而非嵌套在multipart里)

如果你的接口没有用multipart/mixed嵌套PDF,直接修改代码如下即可:

instance.post(GENERATE_LABEL, strigifiedBody, {
  headers: {
    'Content-Type': 'application/json; charset=utf-8'
  },
  responseType: 'arraybuffer' // 直接请求返回ArrayBuffer,不用自己拼流
}).then(res => {
  // 这里拿到的res.data直接就是可以用的Buffer
  const pdfBuffer = Buffer.from(res.data);
  console.log(pdfBuffer);
}).catch(err => {
  console.log(err);
});

方案2:需要解析multipart/mixed响应的情况

如果接口确实返回的是multipart/mixed格式嵌套PDF,不要把流转成字符串,直接用busboy这类工具解析二进制流,避免编码问题:

const Busboy = require('busboy');

instance.post(GENERATE_LABEL, strigifiedBody, {
  headers: {
    'Content-Type': 'application/json; charset=utf-8'
  },
  responseType: 'stream'
}).then(res => {
  const busboy = Busboy({ headers: res.headers });
  // 存储提取到的PDF Buffer
  let pdfBuffer = null;

  busboy.on('file', (fieldname, file, info) => {
    const chunks = [];
    file.on('data', chunk => chunks.push(chunk));
    file.on('end', () => {
      pdfBuffer = Buffer.concat(chunks);
      console.log('提取到的PDF Buffer:', pdfBuffer);
    });
  });

  busboy.on('error', err => console.log('解析multipart失败:', err));
  // 把响应流传给busboy解析
  res.data.pipe(busboy);
}).catch(err => {
  console.log('请求失败:', err);
});
注意事项
  • 不要把PDF二进制流转成utf8字符串处理,utf8编码会把二进制里的非utf8字符转成乱码,最终生成的PDF会损坏无法打开
  • 如果你一定要手动拆分multipart内容,必须在Buffer层面操作,不能转成字符串后拆分
  • 你原有的getBuffer方法里最后调用toString('utf8')是完全错误的,PDF是二进制文件,不能转成utf8字符串,直接返回Buffer.concat(chunks)即可

内容的提问来源于stack exchange,提问作者Ehsan Nissar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 06:06:03