Unity 2022.3.11调用Firebase云函数遇FunctionsException: INTERNAL错误
问题分析与解决
核心错误原因
你遇到的FunctionsException: INTERNAL本质是云函数错误混用了onCall和onRequest模式:
- Firebase的
onCall是专为客户端SDK(比如Unity)设计的Callable函数,自带请求解析、身份验证处理和标准化响应格式,完全不需要依赖Express框架构建路由。 - 你当前把Express的
app作为onCall的参数,完全不符合onCall的要求,直接打乱了请求处理流程,触发内部错误。
另外还有两处细节错误:
onCall的函数参数不是Express的req对象,而是包含data(客户端传入参数)和auth(用户身份信息)的结构体,req.data.idToken写法完全错误。- 错误捕获时直接拼接
error + 'xxx'会丢失错误的详细堆栈信息,不利于后续排查。
修正后的云函数代码
import functions from 'firebase-functions'; import admin from 'firebase-admin'; // 全局初始化Admin SDK(若项目未初始化过) admin.initializeApp(); const functions_address = functions.region('asia-northeast1'); // 正确的onCall函数写法 export const createSessionCookie = functions_address.https.onCall(async (data, context) => { // 从客户端传入的data中获取idToken const idToken = data.idToken; const expiresIn = 60 * 5 * 1000; try { const sessionCookie = await admin.auth().createSessionCookie(idToken, { expiresIn }); // 返回标准化响应,Unity客户端可直接解析 return { sessionCookie }; } catch (error) { // 抛出Firebase标准化错误,客户端能捕获对应错误类型与详情 throw new functions.https.HttpsError('internal', '生成SessionCookie失败', error); } });
Unity端代码优化提示
你的Unity代码中await嵌套ContinueWith的写法可以简化,避免回调嵌套:
// Firebase初始化简化写法 var dependencyStatus = await FirebaseApp.CheckAndFixDependenciesAsync(); if (dependencyStatus == DependencyStatus.Available) { auth = FirebaseAuth.DefaultInstance; reference = FirebaseDatabase.DefaultInstance.RootReference; func = FirebaseFunctions.GetInstance(FirebaseApp.DefaultInstance, "asia-northeast1"); } else { Debug.LogError($"Firebase依赖错误: {dependencyStatus}"); } // 云函数调用简化写法 try { var callable = func.GetHttpsCallable("createSessionCookie"); // 注意传入匿名对象匹配云函数接收的data结构 var result = await callable.CallAsync(new { idToken = idToken }); return result.Data.ToString(); } catch (FunctionsException ex) { Debug.LogError($"云函数调用失败: {ex.Message}"); return ""; }
内容的提问来源于stack exchange,提问作者Choco Naak
相关产品推荐
相关产品推荐

