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

Firebase Cloud Function返回404 NotFound的原因及修复方案

Firebase Cloud Function 404错误排查与修复

错误现象

调用Firebase Cloud Function时返回404错误,控制台显示函数调用计数增加,但函数内的console.log("function call begin")日志未触发。

问题原因

1. Callable调用与HTTP函数不兼容

Flutter代码使用httpsCallable方式调用,但Cloud Function是通过functions.https.onRequest创建的普通HTTP端点,而非onCall创建的Callable函数。两者的请求格式、路由规则完全不同,导致Callable调用无法匹配到正确处理逻辑,返回404。

2. HTTP POST请求与函数路由方法不匹配

直接HTTP调用使用POST方法,但Cloud Function仅定义了app.get("/api")的GET路由,POST请求找不到对应处理逻辑,返回404。同时,HTTP调用将参数放在请求body中,但函数从req.query.prompt(URL参数)获取,即使方法匹配也会出现参数缺失问题。

3. 冗余CORS配置(非直接原因,需优化)

Cloud Function中重复配置了两次CORS,属于冗余代码,可能引发潜在问题。


修复方案

方案一:适配Callable调用(推荐)

将Cloud Function改为Callable函数,该类型专门适配Firebase客户端的httpsCallable调用,自动处理CORS、参数解析和错误格式:

import * as functions from "firebase-functions";
const API_KEY = "***";
const genAI = new GoogleGenerativeAI(API_KEY);

export const api = functions.https.onCall(async (data, context) => {
  console.log("function call begin");
  const prompt = data.prompt;

  if (!prompt) {
    throw new functions.https.HttpsError('invalid-argument', 'Prompt参数必填');
  }
  console.log("准备生成文本:", prompt);
  try {
    const model = genAI.getGenerativeModel({model: "gemini-1.5-flash"});
    const result = await model.generateContent(prompt);
    const response = await result.response;
    const text = await response.text();
    console.log("生成文本:", text);
    return text;
  } catch (error) {
    console.error(error);
    throw new functions.https.HttpsError('internal', '生成内容出错');
  }
});
  • Flutter端的httpsCallable调用代码无需修改,直接使用原代码即可。

方案二:适配直接HTTP POST调用

修改Cloud Function的路由为POST方法,并从请求body中获取参数,同时清理冗余CORS配置:

import * as express from "express";
import * as cors from "cors";
import * as functions from "firebase-functions";
const app = express();

// 单次CORS配置即可
app.use(cors({origin: true}));
// 解析JSON格式的请求体
app.use(express.json());

const API_KEY = "***";
const genAI = new GoogleGenerativeAI(API_KEY);

// 将GET改为POST,或用app.all同时支持GET/POST
app.post("/api", async (req, res) => {
  console.log("function call begin");
  const prompt = req.body.prompt;

  if (!prompt) {
    res.status(400).send("Prompt参数必填");
    return;
  }
  console.log("准备生成文本:", prompt);
  try {
    const model = genAI.getGenerativeModel({model: "gemini-1.5-flash"});
    const result = await model.generateContent(prompt);
    const response = await result.response;
    const text = await response.text();
    console.log("生成文本:", text);
    res.status(200).send(text);
  } catch (error) {
    console.error(error);
    res.status(500).send("生成内容出错");
  }
});

export const api = functions.https.onRequest(app);
  • 确保Flutter端的functionUrl为正确的函数端点,格式示例:https://<地区>-<项目ID>.cloudfunctions.net/api
  • 部署后测试HTTP POST调用,参数会从请求body正确读取。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 10:26:01