如何修正Firebase Functions定时更新Firestore用户字段的代码
修正后的Firebase Functions代码及说明
下面是针对你的需求修正后的代码,同时说明原代码存在的问题:
原代码的主要问题
- 混合使用了CommonJS(
require)和ES模块(export)语法,Firebase Functions默认使用CommonJS,需要统一用exports。 - Pub/Sub调度表达式错误,
00***不符合cron格式,且未指定时区,导致无法按东京时间0点执行。 - 异步操作没有返回Promise,云函数可能在数据库更新完成前就终止,导致部分操作失败。
- 逐个更新文档效率较低,建议用批量更新优化性能。
修正后的完整代码
const functions = require("firebase-functions"); const admin = require("firebase-admin"); admin.initializeApp(); exports.checkTimezone = functions.region('asia-northeast1').https.onRequest(async (req, res) => { console.info(new Date().toString()); // 打印当前时间验证时区 res.send("当前时区验证完成"); }); exports.timer = functions .region('asia-northeast1') .pubsub.schedule('0 0 * * *') // cron表达式:每天0点执行 .timeZone('Asia/Tokyo') // 指定东京时区 .onRun(async (context) => { functions.logger.info("开始重置用户life字段", {structuredData: true}); const usersRef = admin.firestore().collection("users"); const querySnapshot = await usersRef.get(); // 使用批量更新提升效率 const batch = admin.firestore().batch(); querySnapshot.forEach((doc) => { batch.update(doc.ref, { life: 10 }); }); await batch.commit(); functions.logger.info("所有用户life字段已重置为10", {structuredData: true}); return null; // 返回Promise或值表示函数执行完成 });
关键修改说明
- 统一模块语法:把
export const checkTimezone改为exports.checkTimezone,保持CommonJS语法一致。 - 正确的调度配置:
- cron表达式改为
0 0 * * *,表示每天的0分0秒执行。 - 添加
.timeZone('Asia/Tokyo')直接指定时区,无需手动修改process.env.TZ。
- cron表达式改为
- 异步操作处理:
- 使用
async/await替代then,代码更易读且能正确处理异步流程。 - 返回
batch.commit()的Promise,确保云函数等待所有更新完成后再结束。
- 使用
- 批量更新优化:用Firestore的批量写入API替代逐个更新,减少网络请求次数,提升操作效率,尤其当用户文档较多时效果明显。
内容的提问来源于stack exchange,提问作者wasa-bi
相关产品推荐
相关产品推荐

