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

Supabase Edge Functions跨域(CORS)问题排查求助

Supabase Edge Function CORS错误排查与修复

核心问题诊断

你的Edge Function代码存在关键逻辑错误:在判断请求方法(OPTIONS/POST)之前,提前执行了await req.json()。

浏览器发送的OPTIONS预检请求没有请求体,执行req.json()会直接抛出错误,导致代码无法进入OPTIONS分支返回CORS响应头,最终触发浏览器的CORS报错。而Postman/Insomnia不会强制触发预检请求,因此能正常调用函数。

修复方案

将await req.json()移到POST请求的分支内部,确保只有POST请求才会读取请求体:

export const corsHeaders = {
  "Access-Control-Allow-Origin": "*",
  "Access-Control-Allow-Headers":
    "authorization, x-client-info, apikey, content-type",
  "Access-Control-Allow-Methods": "POST, OPTIONS",
};

Deno.serve(async (req) => {
  // 优先处理OPTIONS预检请求,不提前读取请求体
  if (req.method === "OPTIONS") {
    return new Response(null, {
      status: 204,
      headers: corsHeaders, // 204响应无需Content-Type
    });
  }

  if (req.method === "POST") {
    // 仅在POST分支读取请求体
    const { number, topic, baseLanguage, targetLanguage } = await req.json();
    
    let jsonIsValid = false;
    let reply = "";
    let triesCounter = 0;
    do {
      reply = await getVocabularies(
        number,
        topic,
        baseLanguage,
        targetLanguage,
      );
      jsonIsValid = validateJson(reply);
    } while (!jsonIsValid && triesCounter++ < 0);

    let responseText = "ChatGPT responded in no valid JSON format";
    if (jsonIsValid) {
      responseText = JSON.stringify(JSON.parse(reply));
    }

    return new Response(responseText, {
      status: jsonIsValid ? 200 : 500,
      headers: { ...corsHeaders, "Content-Type": "application/json" },
    });
  }

  // 处理未支持的请求方法
  return new Response("Method Not Allowed", { status: 405, headers: corsHeaders });
});

额外检查项

  • 确认函数URL正确性:你提供的URL末尾带有多余单引号,检查实际部署的URL是否存在该问题,避免请求地址无效。
  • React Native调试模式:若使用调试器,代理转发可能干扰CORS头传递,可尝试关闭调试模式直接测试。
  • 重新部署函数:确保修改后的代码已更新到Supabase服务器。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 15:34:54