如何解决使用FormData时出现的source.on is not a function错误?
解决向外部API多文件上传时的"source.on is not a function"错误
你遇到的错误是因为直接将AdonisJS的RequestFile对象传给formData,而formData需要的是符合可读流接口的对象,同时手动设置Content-Type也会导致表单边界(boundary)丢失,引发解析错误。以下是修复方案:
修复后的代码
const axios = require('axios').default import FormData from 'form-data' export default class MyController { public async handleMultipleFile({ request }: HttpContextContract) { const files = request.files('files') if (files.length > 0) { const formData = new FormData() for (let i = 0; i < files.length; i++) { const file = files[i] // 传入文件流、文件名和对应MIME类型 formData.append(`files[${i}]`, file.stream, { filename: file.clientName, contentType: file.type }) } try { const res = await axios.post('https://example-api.com/assets/files', formData, { // 使用formData自动生成的headers,包含正确的boundary headers: formData.getHeaders() }) console.log(res.data) return res.data // 返回结果给Postman查看 } catch (err) { console.error(err) throw err // 抛出错误便于框架处理或返回给客户端 } } return { message: '未上传任何文件' } } }
关键修复点
- 不要手动设置Content-Type:formData的
getHeaders()方法会自动生成包含boundary的正确multipart/form-data头,手动设置会丢失boundary,导致服务器无法解析表单。 - 传递文件流而非原始File对象:AdonisJS的RequestFile对象的
stream属性是标准可读流,拥有on方法,符合formData对数据源的要求,直接传原始对象会触发"source.on is not a function"错误。 - 改用async/await:符合函数的async声明,代码更简洁且能正确返回结果到Postman。
内容的提问来源于stack exchange,提问作者positive developer
相关产品推荐
相关产品推荐

