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

React调用Cloudflare Worker函数遭遇CORS策略拦截的解决方案咨询

解决Cloudflare Workers的CORS问题

嘿,我刚踩过几乎一模一样的坑!Cloudflare Workers确实没有控制台里的可视化开关来配置CORS——所有跨域规则都得直接写在你的Worker代码里,这也是官方推荐的做法。

你的错误核心是:浏览器发送的预飞OPTIONS请求没得到正确的CORS响应头,而且实际请求也缺少Access-Control-Allow-Origin头。下面是具体的修复步骤:

1. 定义CORS配置头

先创建一个包含所有必要跨域规则的对象,你可以根据需求调整允许的源、方法和请求头:

// 本地开发用http://localhost:8000,生产环境替换成你的实际域名
const corsHeaders = {
  "Access-Control-Allow-Origin": "http://localhost:8000",
  "Access-Control-Allow-Methods": "GET, POST, PUT, DELETE, OPTIONS",
  "Access-Control-Allow-Headers": "Content-Type, Authorization",
};

如果只是临时测试,也可以把Access-Control-Allow-Origin设为*允许所有源,但生产环境强烈建议指定具体域名,避免安全风险。

2. 处理预飞OPTIONS请求

浏览器在发送非简单请求(比如带自定义头、POST JSON格式数据等)前,会先发送OPTIONS请求确认跨域权限,我们需要直接返回CORS许可:

async function handleRequest(request) {
  // 优先处理OPTIONS预飞请求
  if (request.method === "OPTIONS") {
    return new Response(null, { headers: corsHeaders });
  }
  
  // 下面是你原来的业务逻辑,记得给所有响应加上CORS头
  const { pathname } = new URL(request.url);
  if (pathname.startsWith("/api")) {
    return new Response(JSON.stringify({ pathname }), {
      headers: {
        ...corsHeaders, // 合并CORS头和业务响应头
        "Content-Type": "application/json",
      },
    });
  }
  if (pathname.startsWith("/status")) {
    const httpStatusCode = Number(pathname.split("/")[2]);
    if (Number.isInteger(httpStatusCode)) {
      // 对fetch返回的第三方响应,也要添加CORS头
      const catResponse = await fetch("https://http.cat/" + httpStatusCode);
      return new Response(catResponse.body, {
        headers: {
          ...corsHeaders,
          ...catResponse.headers,
        },
      });
    } else {
      return new Response("That's not a valid HTTP status code.", {
        headers: corsHeaders,
      });
    }
  }
  return new Response(JSON.stringify({ hello: "world" }), {
    headers: {
      ...corsHeaders,
      "Content-Type": "application/json",
    },
  });
}

3. 给错误响应也加上CORS头

别忘了在错误捕获逻辑里也添加CORS头,不然报错时浏览器还是会拦截错误信息:

addEventListener("fetch", (event) => {
  event.respondWith(
    handleRequest(event.request).catch(
      (err) => new Response(err.stack, { 
        status: 500,
        headers: corsHeaders // 这里必须加!
      })
    )
  );
});

为什么这样能解决问题?

  • 预飞OPTIONS请求得到了明确的跨域许可,浏览器会放行后续的实际请求
  • 所有响应都带上了Access-Control-Allow-Origin头,浏览器确认跨域合法后就不会再拦截返回的数据

把这些修改加到你的Worker代码里,重新部署后,本地的React应用应该就能正常调用接口了!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.01 00:32:42