将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
相关产品推荐
相关产品推荐

