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

React搭配Express+Multer上传文件时response.ok恒为false问题求助

问题根源
  • 核心问题是你在fetch配置中加了mode: "no-cors":该模式下浏览器仅允许请求发送成功,但是返回的响应是*不透明(opaque)*类型,无法读取响应状态、响应体等任何内容,所以response.ok固定为false,也拿不到返回的图片地址。
  • 去掉no-cors配置后会触发跨域错误:你的React前端和Express服务端端口不同,属于跨域请求,服务端未配置跨域资源共享(CORS)规则,浏览器会拦截响应。
  • 另外路由代码存在小缺陷:无匹配文件时仅设置了422状态码,没有结束响应,会导致请求挂起。
修复步骤
  1. 修改React客户端fetch配置
    删除mode: "no-cors"字段,同时增加读取响应体的逻辑:
const uploadImage = async (img) => {
  const formData = new FormData();
  formData.append("image", img);
  try {
    const response = await fetch(
      "http://localhost:3002/admin/uploadImage",
      {
        method: "POST",
        body: formData,
      }
    );
    // 读取返回的图片地址
    const imageUrl = await response.text();
    console.log("上传成功,图片地址:", imageUrl);
  } catch (error) {
    setError(error.message);
  } finally {
    setIsLoading(false);
  }
};
  1. Express服务端配置CORS
    首先安装cors依赖:
    npm install cors
    然后修改服务端入口代码,引入并使用cors中间件:
const express = require("express");
const multer = require("multer");
const path = require("path");
const cors = require("cors"); // 引入cors

const app = express();
const adminRoutes = require("./routes/admin");

app.use(cors()); // 全局启用cors,放在所有路由前面
// 后续原有配置保持不变
  1. 优化admin路由逻辑
    修正响应逻辑,同时返回可直接访问的静态资源地址:
router.post("/uploadImage", (req, res, next) => {
  const image = req.file;
  if (!image) {
    // 错误时返回状态码+提示,结束响应
    return res.status(422).send("上传的文件格式不符合要求");
  }
  // 拼接完整可访问的静态地址
  const imageUrl = `http://localhost:3002/${image.path}`;
  console.log(imageUrl);
  res.send(imageUrl);
});
可选优化

你当前遍历文件上传时没有等待异步请求完成,isLoading状态会提前结束,可修改为:

await Promise.all(Array.from(imageFiles).map(image => uploadImage(image)));

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 10:24:08