Firebase HTTPS OnCall函数调用失败:好友请求系统开发求助
看起来你遇到的INTERNAL错误主要是由几个关键问题导致的,尤其是云函数缺少返回值、数据处理逻辑错误,还有前端传参的小问题。咱们一步步来修复:
云函数的核心问题与修正
你的sendFriendRequest云函数有几个明显的问题:
不需要手动解析data
https.onCall会自动将前端传入的JSON解析为JavaScript对象,所以JSON.parse(data)会报错,直接使用data即可。Push操作的异步处理与Key获取错误
push()是异步操作,而且你获取pushKey的方式不对——requestedUserProfileRef.key是父节点(Users/{recievingUser})的key,不是push生成的新请求节点的key。需要先调用push()获取新的引用,再获取它的key。错误使用set()覆盖数据
requestedUserProfileRef.set(jsonData["sendingUser"])会覆盖整个用户节点的所有数据,这绝对不是你想要的。应该把发送方的UID设置到新的好友请求子节点里。缺少返回值与错误处理
onCall函数必须返回一个Promise或者具体值,否则Firebase会认为函数执行异常,返回INTERNAL错误。同时要捕获数据库操作的错误,抛出给前端。
修正后的云函数代码:
const functions = require("firebase-functions"); const admin = require("firebase-admin"); admin.initializeApp(); // 确保初始化Admin SDK exports.sendFriendRequest = functions.https.onCall(async (data, context) => { // 验证用户是否已认证(可选但推荐) if (!context.auth) { throw new functions.https.HttpsError("unauthenticated", "用户未登录"); } const { sendingUser, recievingUser } = data; // 验证必要参数是否存在 if (!sendingUser || !recievingUser) { throw new functions.https.HttpsError("invalid-argument", "缺少必要参数"); } try { const requestedUserProfileRef = admin.database().ref(`Users/${recievingUser}/FriendRequests`); // 生成新的请求节点并设置发送方UID const newRequestRef = requestedUserProfileRef.push(); await newRequestRef.set(sendingUser); console.log(`好友请求已发送给 ${recievingUser}`); return { success: true, requestId: newRequestRef.key }; } catch (error) { throw new functions.https.HttpsError("unknown", "发送请求失败", error.message); } });
前端调用的修正
你的前端代码里,传参时多套了一层data对象,云函数里直接取data.sendingUser即可,不需要data.data.sendingUser。另外,可以加上错误处理,方便调试:
function sendFriendRequest(userUid) { const curUser = firebase.auth().currentUser; if (!curUser) { alert("请先登录"); return; } userUid = userUid.substring(1); const sendRequest = firebase.functions().httpsCallable('sendFriendRequest'); sendRequest({ sendingUser: curUser.uid, recievingUser: userUid }) .then(function(result) { console.log("好友请求发送成功", result.data); // 这里可以添加UI提示,比如"请求已发送" }) .catch(function(error) { console.error("发送请求失败:", error.message); alert("发送失败:" + error.message); }); }
关键错误原因总结
- INTERNAL错误的主要原因:云函数没有返回值,Firebase无法确认函数是否执行完成,因此返回内部错误。
- 数据处理错误:手动解析data导致错误,push后的key获取错误,set()覆盖用户数据会破坏原有用户信息。
- 前端传参冗余:多套了一层
data对象,导致云函数无法正确获取参数。
现在部署修正后的云函数,再调用应该就能正常工作了。
内容的提问来源于stack exchange,提问作者Nathan Hennigh

