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
相关产品推荐
相关产品推荐

