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

如何解决使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 05:03:27