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

React+Node.js项目设置multipart/form-data时触发CORS跨域错误求助

问题排查与解决方案

1. 修复前端PUT请求封装逻辑

你当前的put封装中对入参data做了{ ...data }的对象包裹处理,如果传入的data是FormData类型,该展开操作会直接丢失FormData的所有内置属性,axios无法识别为文件上传请求,会将其序列化为普通JSON对象,导致请求格式完全错误。
修改代码如下:

export async function put(url, data, config = {}) {
  return axiosApi
    .put(url, data, { ...config })
    .then(response => response.data)
}

2. 删除手动设置的multipart/form-data请求头

手动设置Content-Type: multipart/form-data会丢失文件上传请求必须的boundary分隔符参数,该参数由axios自动生成,用于分隔formData内的不同字段,手动设置会直接导致后端无法正确解析请求体。
axios检测到请求体为FormData类型时,会自动补全正确的带boundary参数的Content-Type头,无需手动配置,修改接口调用代码如下:

export const updateProduct = data =>
  put(url.UPDATE_PRODUCT, data)

3. 修复后端CORS配置拼写错误

你的CORS配置中响应头Access-Control-Allow-Method拼写错误,正确头名为Access-Control-Allow-Methods(末尾缺少s),浏览器发起OPTIONS预检请求时无法识别该错误头,就会判定CORS校验不通过,抛出跨域错误。同时建议单独处理OPTIONS预检请求,避免后续业务中间件拦截预检请求。
修改后的后端CORS配置如下:

app.use((req, res, next) => {
    res.setHeader('Access-Control-Allow-Origin', '*');
    res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, PATCH, DELETE, OPTIONS');
    res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization');
    // 处理预检请求直接返回成功状态
    if (req.method === 'OPTIONS') {
      return res.sendStatus(204)
    }
    next();
})

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 03:57:00