qidao123.com技术社区-IT企服评测·应用市场

标题: axios升级1.7.4时,FormData方式请求报错 [打印本页]

作者: 用户云卷云舒    时间: 2025-3-13 17:50
标题: axios升级1.7.4时,FormData方式请求报错
背景:公司要求将 axios 从 0.18.0 升级到 1.7.4 。然而升级过程中发现,FormData 请求报错。
经排查,axios 1.X版本有很大的改变。这个报错大概是由于新版 axios 对 FormData 的处理逻辑和请求头配置的调解导致的。
标题根源分析


解决方案

1. 浏览器环境

步骤 1:移除手动设置的 Content-Type 头
  1. // 错误写法(手动覆盖 Content-Type)
  2. axios.post("/upload", formData, {
  3.   headers: {
  4.     "Content-Type": "multipart/form-data", // ❌ 删除此行
  5.   },
  6. });
  7. // 正确写法(由 axios 自动设置)
  8. axios.post("/upload", formData); // ✅
复制代码
步骤 2:确保正确创建 FormData 对象
  1. // 创建 FormData 实例
  2. const formData = new FormData();
  3. // 添加文件字段
  4. const fileInput = document.querySelector('input[type="file"]');
  5. formData.append("file", fileInput.files[0]);
  6. // 添加文本字段
  7. formData.append("name", "file-upload");
  8. // 发送请求
  9. axios.post("/upload", formData)
  10.   .then((res) => console.log(res.data))
  11.   .catch((err) => console.error("Error:", err));
复制代码

2. Node.js 环境

步骤 1:安装 form-data 包
  1. npm install form-data
复制代码
步骤 2:生成并配置 FormData
  1. const FormData = require("form-data");
  2. const axios = require("axios");
  3. const fs = require("fs");
  4. // 创建 FormData 实例
  5. const formData = new FormData();
  6. // 添加文件(Stream 或 Buffer)
  7. formData.append("file", fs.createReadStream("./test.jpg"));
  8. // 添加文本字段
  9. formData.append("text", "Hello from Node.js");
  10. // 发送请求时携带 headers(必须包含 formData 的 headers)
  11. axios.post("http://example.com/upload", formData, {
  12.   headers: {
  13.     ...formData.getHeaders(), // ✅ 获取正确的 Content-Type 和 boundary
  14.   },
  15. })
  16.   .then((res) => console.log(res.data))
  17.   .catch((err) => console.error("Error:", err.message));
复制代码

常见错误及修复

错误 1:Missing boundary in Content-Type


错误 2:Request body is not a FormData instance


错误 3:Unexpected end of form data(Node.js)



验证代码是否兼容

在代码中添加以下查抄:
  1. // 检查是否为合法的 FormData 实例
  2. if (!(formData instanceof FormData)) {
  3.   throw new Error("Data must be a FormData instance!");
  4. }
  5. // 检查请求头是否包含 boundary
  6. console.log(formData.getHeaders()); // Node.js 中应输出类似 { "content-type": "multipart/form-data; boundary=..." }
复制代码

迁移注意事项


完整示例代码

浏览器端

  1. <input type="file" id="fileInput" />
  2. <button onclick="upload()">Upload</button>
  3. <script src="https://cdn.jsdelivr.net/npm/axios@1.7.4/dist/axios.min.js"></script>
  4. <script>
  5.   async function upload() {
  6.     const fileInput = document.getElementById("fileInput");
  7.     const formData = new FormData();
  8.     formData.append("file", fileInput.files[0]);
  9.     formData.append("comment", "Uploaded via axios 1.7.4");
  10.     try {
  11.       const res = await axios.post("/upload", formData);
  12.       console.log("Success:", res.data);
  13.     } catch (err) {
  14.       console.error("Error:", err.message);
  15.     }
  16.   }
  17. </script>
复制代码
Node.js 端

  1. const FormData = require("form-data");
  2. const axios = require("axios");
  3. const fs = require("fs");
  4. async function uploadFile() {
  5.   const formData = new FormData();
  6.   formData.append("file", fs.createReadStream("./test.jpg"));
  7.   formData.append("text", "Node.js upload");
  8.   try {
  9.     const res = await axios.post("http://example.com/upload", formData, {
  10.       headers: formData.getHeaders(),
  11.     });
  12.     console.log("Success:", res.data);
  13.   } catch (err) {
  14.     console.error("Error:", err.message);
  15.   }
  16. }
  17. uploadFile();
复制代码

通过以上调解,可确保 FormData 请求在 axios@1.7.4 中正常工作。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 qidao123.com技术社区-IT企服评测·应用市场 (https://dis.qidao123.com/) Powered by Discuz! X3.4