基于Firestore的Firebase推荐注册奖励云函数部署问题
修复Firebase Cloud Function的语法与逻辑问题
你的代码里存在几处语法错误,还有Firebase Functions API使用上的问题,我帮你一步步排查和修正:
主要问题分析
- 过时的API调用:旧版的
event.data已经被废弃,当前Firestore触发器的onCreate方法会传入snapshot和context参数,需要通过snapshot.data()获取文档数据。 - 错误的文档引用操作:
documentRef.data.ref是完全错误的写法,文档引用本身就可以直接调用更新方法;而且你直接写credits +5,但credits变量未定义,必须先读取推荐人当前的积分值。 - 语法不完整:
set方法的括号没有闭合,catch的箭头函数语法也写错了,缺少必要的符号和逻辑。
修正后的完整代码
// 确保初始化Firebase Admin const admin = require('firebase-admin'); admin.initializeApp(); const functions = require('firebase-functions'); exports.createUser = functions.firestore .document('users/{userId}') .onCreate(async (snapshot, context) => { // 获取新注册用户的推荐人ID const newUser = snapshot.data(); const referredBy = newUser.referredBy; // 没有推荐人时直接返回,避免无效操作 if (!referredBy) { console.log('No referrer ID found, exiting function'); return null; } // 构建推荐人账户信息的文档引用 const referrerAccountRef = admin.firestore() .doc(`users/${referredBy}/cats/accountInformation`); try { // 先读取推荐人当前的积分数据 const referrerAccountSnap = await referrerAccountRef.get(); if (!referrerAccountSnap.exists) { console.log('Referrer account document does not exist'); return null; } // 处理积分未初始化的情况,默认设为0 const currentCredits = referrerAccountSnap.data().credits || 0; // 更新积分,使用update避免覆盖整个文档 await referrerAccountRef.update({ credits: currentCredits + 5 }); console.log(`Successfully added 5 credits to referrer ${referredBy}`); return null; } catch (error) { console.error('Error giving credits:', error); return null; } });
关键修正说明
- API适配:改用新版触发器参数,并用
async/await处理异步操作,比回调写法更清晰易维护。 - 容错处理:添加了推荐人ID、推荐人文档是否存在的检查,避免空值引发的错误。
- 正确的字段更新:使用
update而非set,确保只修改积分字段,不会覆盖推荐人账户的其他数据;同时先读取当前积分再累加,避免直接覆盖原有值。 - 语法补全:修复了所有缺失的括号、箭头函数的错误写法,完善了错误捕获逻辑。
内容的提问来源于stack exchange,提问作者overhound
相关产品推荐
相关产品推荐

