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

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();
}

注意事项

  1. 版本兼容:确保Node.js版本≥12.3.0以使用Readable.from,旧版本请用方案2。
  2. FormData库选择:若使用Node.js内置FormData(v18+),无需额外安装包;若用低版本Node.js,建议安装form-data包。
  3. 必填参数:调用formData.append时,必须传入文件名和内容类型,否则第三方服务可能无法正确解析文件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 03:43:26