定时Cloud Function因undefined "uid"无法返回值的问题排查
问题分析
定时触发的PubSub Cloud Function没有用户认证上下文,所以context.auth是undefined,直接访问context.auth!.uid会抛出错误——这是你代码的核心问题。要实现“给所有用户的bank子集合文档更新字段”,需要先遍历users集合下的所有用户文档,再逐个处理对应的bank子集合。
修正后的代码
import * as functions from "firebase-functions"; import * as admin from "firebase-admin"; admin.initializeApp(); // 确保初始化Admin SDK export const dailyCreditReinitialize = functions.pubsub.schedule('0 0 * * *').onRun(async (context) => { const usersSnapshot = await admin.firestore().collection('users').get(); // 如果没有用户,直接返回 if (usersSnapshot.empty) { console.log("没有用户数据需要处理"); return null; } const batch = admin.firestore().batch(); let operationCount = 0; const maxBatchSize = 500; // Firestore批量操作上限 // 遍历每个用户文档 for (const userDoc of usersSnapshot.docs) { const bankSnapshot = await userDoc.ref.collection('bank').get(); // 遍历当前用户的bank子集合文档 bankSnapshot.forEach(bankDoc => { // 检查批量操作数,超过上限就提交并新建批次 if (operationCount >= maxBatchSize) { await batch.commit(); batch = admin.firestore().batch(); operationCount = 0; } batch.update(bankDoc.ref, { dailyRewardCounter: admin.firestore.FieldValue.increment(150) // 若需求是重置为150,替换为 dailyRewardCounter: 150 }); operationCount++; }); } // 提交最后一批未完成的操作 if (operationCount > 0) { await batch.commit(); console.log("所有用户的dailyRewardCounter已更新"); } return null; });
关键说明
- 遍历所有用户:用
collection('users').get()获取所有用户文档,代替原代码中错误的context.auth.uid获取方式。 - 批量操作限制处理:Firestore单批操作最多支持500个,代码中加入了批次拆分逻辑,避免因数据量过大触发平台限制。
- 字段更新逻辑:
- 若需求是给当前值累加150,使用
FieldValue.increment(150); - 若需求是直接设置为150,替换为
dailyRewardCounter: 150即可。
- 若需求是给当前值累加150,使用
- Admin SDK初始化:确保代码开头完成Firebase Admin SDK初始化,否则无法正常访问数据库。
内容的提问来源于stack exchange,提问作者Mike_Baltimore
相关产品推荐
相关产品推荐

