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

React修改用户密码接口遭遇CORS跨域拦截问题求助

解决React修改密码路由的CORS跨域问题

一、先修正代码中的请求体与Content-Type不匹配问题

你当前代码里用了FormData却手动设置Content-Type: application/json,这会导致请求格式混乱,同时可能触发CORS预检失败:

// 错误写法
const formData = new FormData();
formData.append("password", formState.inputs.confirmNewPassword.value);
await sendRequest(
  process.env.REACT_APP_BACKEND_URL + `/users/${userId}/change-password`,
  "PATCH",
  formData,
  {
    Authorization: "Bearer " + auth.token,
    "Content-Type": "application/json", // 这里和FormData冲突
  }
);

改成JSON格式发送(适配后端期望JSON的情况):

const requestBody = JSON.stringify({
  password: formState.inputs.confirmNewPassword.value
});
await sendRequest(
  process.env.REACT_APP_BACKEND_URL + `/users/${userId}/change-password`,
  "PATCH",
  requestBody,
  {
    Authorization: "Bearer " + auth.token,
    "Content-Type": "application/json",
  }
);

如果后端确实需要FormData,则移除手动设置的Content-Type,让浏览器自动添加正确的multipart/form-data头:

const formData = new FormData();
formData.append("password", formState.inputs.confirmNewPassword.value);
await sendRequest(
  process.env.REACT_APP_BACKEND_URL + `/users/${userId}/change-password`,
  "PATCH",
  formData,
  {
    Authorization: "Bearer " + auth.token,
    // 移除Content-Type设置
  }
);

二、确认后端对PATCH请求的OPTIONS预检响应

PATCH属于非简单请求,浏览器会先发送OPTIONS预检请求,后端必须正确返回以下响应头:

  • Access-Control-Allow-Origin: 允许你的前端域名(生产环境不建议用*)
  • Access-Control-Allow-Methods: 必须包含PATCH
  • Access-Control-Allow-Headers: 必须包含Authorization(因为你请求里带了这个头)

即使其他接口正常,也要确认这个PATCH接口的OPTIONS处理逻辑是否和其他接口一致,比如是否遗漏了对PATCH方法的允许。

三、禁用mode: 'no-cors'

这个模式会让浏览器强制屏蔽响应内容,同时限制请求头的设置,完全无法解决实际的CORS问题,只会让你无法获取请求结果,直接去掉这个配置。

内容的提问来源于stack exchange,提问作者V.T

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 22:19:21