Node.js中如何将二进制Buffer转换为ReadableStream适配第三方API
Node.js中将Buffer转换为可读流并传入FormData的正确方法
错误原因分析
你遇到的「source.on is not a function」错误,通常是因为传入FormData的不是有效可读流对象,可能是Node.js版本不兼容、流创建方式错误,或是FormData库的适配问题导致的。
正确转换方法
以下是两种可靠的Buffer转可读流方案,适配不同Node.js版本:
方案1:使用Node.js v12.3.0+内置的Readable.from
这是最简洁的方式,直接将Buffer转换为可读流:
const { Readable } = require('stream'); const FormData = require('form-data'); // 或Node.js 18+内置的FormData // 假设从SQL Server取出的文件Buffer为fileBuffer,原文件名filename,文件类型contentType const fileStream = Readable.from(fileBuffer); // 若第三方服务要求流携带文件名属性,可手动添加(部分FormData库依赖此属性) fileStream.path = filename;
方案2:兼容旧版Node.js(v12.3.0以下)
手动创建可读流并推入Buffer:
const { Readable } = require('stream'); const FormData = require('form-data'); const fileStream = new Readable(); fileStream.push(fileBuffer); fileStream.push(null); // 标记流结束,必须添加 fileStream.path = filename; // 可选,按需添加
完整请求示例
将流传入FormData并发送给第三方服务:
async function submitToThirdParty(fileBuffer, filename, contentType) { const formData = new FormData(); // 转换Buffer为可读流 const fileStream = Readable.from(fileBuffer); // 将流添加到FormData,必须指定文件名和内容类型 formData.append('file', fileStream, { filename: filename, contentType: contentType }); // 发送请求(以node-fetch为例) const response = await fetch('https://third-party-service.com/verify', { method: 'POST', body: formData, headers: formData.getHeaders() // 自动生成multipart/form-data的正确请求头 }); return await response.json(); }
注意事项
- 版本兼容:确保Node.js版本≥12.3.0以使用
Readable.from,旧版本请用方案2。 - FormData库选择:若使用Node.js内置FormData(v18+),无需额外安装包;若用低版本Node.js,建议安装
form-data包。 - 必填参数:调用
formData.append时,必须传入文件名和内容类型,否则第三方服务可能无法正确解析文件。
内容的提问来源于stack exchange,提问作者Thierry
相关产品推荐
相关产品推荐

