Node.js中FormData上传图片报错:source.on is not a function
解决Node.js上传文件时"source.on is not a function"错误
问题原因分析
你的代码存在两个核心问题:
- 配置项放错位置:
maxBodyLength和maxContentLength是axios的请求配置参数,不属于请求头范畴,放在headers对象里会导致axios无法正确解析。 - FormData处理及请求头配置错误:Node.js环境下直接传递buffer到FormData易引发流处理异常,且未正确设置带boundary的
Content-Type,导致axios无法识别请求体格式。
修正后的代码
const fs = require('fs'); const FormData = require('form-data'); // 确保已安装form-data库 const axios = require('axios'); const uploadFile = async () => { // 用可读流替代readFileSync,兼容性和性能更优 const fileStream = fs.createReadStream('scripts/pose.png'); const formData = new FormData(); // 传递文件流并指定文件名、类型 formData.append('file', fileStream, { filename: 'dummyName.png', contentType: 'image/png' }); // 合并授权头和FormData自动生成的请求头(含boundary) const headers = { Authorization: `Bearer ${jwt}`, ...formData.getHeaders() }; const response = await axios.post( `${process.env.URL}/v1/files`, formData, { headers, maxBodyLength: Infinity, maxContentLength: Infinity // 这两个参数放在请求配置中而非headers } ); return response; };
关键修正点说明
- 替换buffer为文件流:
fs.createReadStream比readFileSync更适合文件上传场景,FormData在Node.js环境下对流的支持更稳定,避免buffer引发的流处理错误。 - 正确配置请求头:通过
formData.getHeaders()获取带boundary的Content-Type,手动合并Authorization,确保请求头格式符合要求。 - 调整axios配置位置:将
maxBodyLength和maxContentLength移至axios的请求配置对象中,而非headers字段内。
额外注意事项
- 先安装依赖:执行
npm install form-data或yarn add form-data。 - 若必须使用buffer,可将其包装为可读流:
const { Readable } = require('stream'); const bufferStream = Readable.from(buffer); formData.append('file', bufferStream, 'dummyName.png');
内容的提问来源于stack exchange,提问作者MayAsk
相关产品推荐
相关产品推荐

